CSVファイルのスレ
おそらく一番簡単なデータベースと思われるCSVファイルについていろいろ語りましょう。 Cassava Editorっていまもまだ更新続いてるのか・・・
現在進行形で10年以上、更新が続いているってすごいな
作者尊敬するわ >>273
あすかぜさんは神
あすかぜさん無しでは生きていけない Cassava Editorが存在することで日本の生産性が向上していることは間違いない 幾度ものタピオカブームの浮き沈みも関係なく
cassava editorは進歩する SUMとかAVERAGEとかの基本的な関数だけでも実装してくれたらなぁ。。 「Cassava Editor」https://www.asukaze.net/soft/cassava/ v2.2.0 (2020/07/04)
64 bit 版を追加。
マクロファイルの文字コードを Shift-JIS から UTF-8 に変更。
ただし、UTF-8 として読み込めない場合は Shift-JIS として解釈される。
これぞ最強・最速・最高性能 CSVはRFCに従うよりエンマークでエスケープした方がLinuxで使いやすい
RFCとは別にPOSIXのCSVとしてエンマークエスケープのCSVが普及して欲しいと思う今日この頃 ASCIIセパレータのことも思い出してあげてください 制御文字は人間に優しくないのがつらいんよねー
システマチックに使うだけなら良いかも Twitterで100GBのCSVを10GBのメモリのPCでソートするにはどうすればよいかって話題になってた
どうやればよいのだろうね 死ねばいいんじゃないんですかね
そういうシステムを作っちゃうやつは必ず同じ失敗を繰り返す システムの良し悪しじゃなくてDBに入れるとかそういう具体的なやり方の話をしたかった CSVは基本可変長レコードだから、ファイルへのランダムアクセスでデータが取り出せない
それだけでソート行うのに不適ってわからない時点でもうダメ
データの入れ替えもとんでもなく困難
ファイルを固定長にするという発想があれば
ソートも入れ替えも比較的容易に出来るんですがねぇ…
あとはメモリ使用量の少ないソートアルゴリズムを選べばいい まさかcsvのソートができないなんて上から目線で言うやつがいるとは思わんかった。 ではイキリマンとは違う事を
正解を示すことで証明していただきたい ソートするだけならマージソートでやれば良い
マージソートはレコードをシーケンシャルに読み書きしていくだけで良い
CSVが100GBで、1レコードが1KBだと仮定するとレコード数は1億
log2(1億) = 26.5
27回はスプリットとマージを繰り返さないといけない
100GB * 27 * 2(読みと書き) = 5400GB
ストレージの読み書き速度が500MB/sだとして3時間
性能要件的に3時間が是か非か
SQLiteやPostgreSQLにデータを入れてSQLでソートするにしても
DBではデータがノーマライズされるうえにインデックスも構築されるから
なんだかんだで同じくらい時間がかかりそう
RedshiftやBigQueryといった分散処理ができるDBを使えば速いだろうけど
ネットワークの速度が100MB/sだと仮定するとデータを転送するだけで16分かかるから
なんだかんだで20分前後かなあ
ストレージのIOがボトルネックになるとしてそれを改善するには
CSVを1回読んでレコードの(sortkey, offset, length)の組を抜き出してその組をソートして最後にレコードを抜き出すのが良い
1つの(sortkey, offset, length)が40バイトだとしてそれが1億あると4GB、PCのメモリが10GBならオンメモリでソートできそう
RFC4180に従う汎用的なCSVを入力として受け付けるならoffset, lengthの計算がちと面倒かもね
入力の生データを保持してCSVをパースできるならレコードをパースして生データからoffset, lengthを計算すればよいけれども
対応してるライブラリがあるかはわからない、CSVのパーサを自作する必要があるかも 10GBに収まるギリギリまでメモリ上でソートすればいいので27回も繰り返す必要はないのか
ストレージ上のデータがメモリ上では10倍になるとしてメモリ上でソートできるのは100万レコードくらいかな
100万レコードが100個できるとして
log2(100) = 6.6
100GB * 7 * 2(読みと書き) = 1400GB
ストレージの読み書き速度が500MB/sだとして47分
結構速いな Excel365で開くと、最初は問題なく開けるのに、
しばらく使ってから開くと文字化けするのはなに?
文字化けするファイルもしないファイルも文字コードは同じ
PC再起動すれば一時的に直るけど、またしばらく使ってると再発する