• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:perlで大容量CSVのsort方法について)

perlで大容量CSVのソート方法とは?

このQ&Aのポイント
  • perlでcsvファイル100MB超のファイルをソートする方法について相談です。
  • ソート方法を探している中で、メモリーの関係上ソートができない状況に悩んでいます。
  • 11万件のデータがあり、エクセルでのソートも難しく困っています。

質問者が選んだベストアンサー

  • ベストアンサー
  • kumoz
  • ベストアンサー率64% (120/185)
回答No.2

ファイルを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;

hihin2003
質問者

お礼

早速やってみました。 すごいです!! 無事動作させることが出来ました!! 140MBを超えるデータですが、1分かからないで終わります。 こんなにパフォーマンスが向上する方法があるのかと目から鱗です。 いつも助かります。ありがとうございました。

その他の回答 (2)

  • kumoz
  • ベストアンサー率64% (120/185)
回答No.3

> foreach my $key (sort { $b <=> $a } keys $sorted) { No2 です。1つ誤記がありました。訂正します。 foreach my $key (sort { $b <=> $a } keys %sorted) {

hihin2003
質問者

お礼

訂正ありがとうございます。 助かります。

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

メモリが無理なら、ファイルに頼るしかないでしょう。 ファイルのような外部記録を使ったソートアルゴリズムには自然マージソートがあります。 この方法だと、1行ずつ処理すればいいので、メモリはそれほど使いません。 CPANのFile::Sortモジュールがmerge sortのようです。 http://search.cpan.org/~cnandor/File-Sort-1.01/Sort.pm あるいは、Cとかのソースは見付かるので、自分で作ってもいいでしょう。

hihin2003
質問者

お礼

いつもアドバイスありがとうございます。 File::Sortモジュールについて少し調べてやってみようと思いましたが、うまくいきませんでした。 サーバーがこのモジュールがないのかもしれませんので確認をしてみようと思います。