- ベストアンサー
perlで大容量CSVのソート方法とは?
- perlでcsvファイル100MB超のファイルをソートする方法について相談です。
- ソート方法を探している中で、メモリーの関係上ソートができない状況に悩んでいます。
- 11万件のデータがあり、エクセルでのソートも難しく困っています。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
ファイルを1度に読み込まずに、while ループで読み込んでソートキーをハッシュのキーに割り当て、ハッシュの配列に保存して、一定数になったらファイルに保存して、最後にまとめればそれほどメモリは必要ないと思います。 my %sorted; while (my $line = <$fh>) { my $key = (split /,/, $line)[0]; push @{$sorted{$key}}, $line; if (@{$sorted{$key}} == 1000) { open OUT, ">>$key.tmp" or die "Can't open: $!"; print OUT @{$sorted{$key}}; close OUT; @{$sorted{$key}} = (); } } open OUT, ">out.txt" or die "Can't open: $!"; foreach my $key (sort { $b <=> $a } keys $sorted) { if (-e "$key.tmp") { open IN, "$key.tmp" or die "Can't open: $!"; print OUT while <IN>; close IN; } print OUT @{$sorted{$key}} if @{$sorted{$key}}; } close OUT;
その他の回答 (2)
- kumoz
- ベストアンサー率64% (120/185)
> foreach my $key (sort { $b <=> $a } keys $sorted) { No2 です。1つ誤記がありました。訂正します。 foreach my $key (sort { $b <=> $a } keys %sorted) {
お礼
訂正ありがとうございます。 助かります。
- kmee
- ベストアンサー率55% (1857/3366)
メモリが無理なら、ファイルに頼るしかないでしょう。 ファイルのような外部記録を使ったソートアルゴリズムには自然マージソートがあります。 この方法だと、1行ずつ処理すればいいので、メモリはそれほど使いません。 CPANのFile::Sortモジュールがmerge sortのようです。 http://search.cpan.org/~cnandor/File-Sort-1.01/Sort.pm あるいは、Cとかのソースは見付かるので、自分で作ってもいいでしょう。
お礼
いつもアドバイスありがとうございます。 File::Sortモジュールについて少し調べてやってみようと思いましたが、うまくいきませんでした。 サーバーがこのモジュールがないのかもしれませんので確認をしてみようと思います。
お礼
早速やってみました。 すごいです!! 無事動作させることが出来ました!! 140MBを超えるデータですが、1分かからないで終わります。 こんなにパフォーマンスが向上する方法があるのかと目から鱗です。 いつも助かります。ありがとうございました。