CSVファイルのスレ (296レス)
上下前次1-新
抽出解除 必死チェッカー(本家) (べ) 自ID レス栞 あぼーん
293: 2022/09/11(日)01:48 ID:Mo970C1D(1/2) AAS
ソートするだけならマージソートでやれば良い
マージソートはレコードをシーケンシャルに読み書きしていくだけで良い
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のパーサを自作する必要があるかも
294: 2022/09/11(日)02:08 ID:Mo970C1D(2/2) AAS
10GBに収まるギリギリまでメモリ上でソートすればいいので27回も繰り返す必要はないのか
ストレージ上のデータがメモリ上では10倍になるとしてメモリ上でソートできるのは100万レコードくらいかな
100万レコードが100個できるとして
log2(100) = 6.6
100GB * 7 * 2(読みと書き) = 1400GB
ストレージの読み書き速度が500MB/sだとして47分
結構速いな
上下前次1-新書関写板覧索設栞歴
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.775s*