
perlで大容量CSVのsort方法について
perlでcsvファイル100MB超のファイルをソートしたいと思ってますが、以下の方法でメモリーの関係上(と思ってます。)できません。
ソートを行う方法がありますでしょうか?
件数も11万件あるので、エクセルでソートしてからの受け渡しが出来ずに悩んでます。
(ここから)
#sortロジック
sub sort {
use warnings;
use feature ':5.10';
open my $ifh, '<', $inport or &error("Can't open $inport");
my @lines = <$ifh>;
close $ifh;
print @lines, "\n";
#csvファイル何番目?
my @sorted = map { $_->[0] }
sort { $b->[0] <=> $a->[0]}
map { [(split q{,}, $_)[0], $_] }
@lines;
@lines = @sorted;
exit;
}
(ここまで)
いつも貴重なアドバイスをありがとうございます。よろしくお願いいたします。
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;
早速やってみました。
すごいです!!
無事動作させることが出来ました!!
140MBを超えるデータですが、1分かからないで終わります。
こんなにパフォーマンスが向上する方法があるのかと目から鱗です。
いつも助かります。ありがとうございました。
No.3
- 回答日時:
> foreach my $key (sort { $b <=> $a } keys $sorted) {
No2 です。1つ誤記がありました。訂正します。
foreach my $key (sort { $b <=> $a } keys %sorted) {
No.1
- 回答日時:
メモリが無理なら、ファイルに頼るしかないでしょう。
ファイルのような外部記録を使ったソートアルゴリズムには自然マージソートがあります。
この方法だと、1行ずつ処理すればいいので、メモリはそれほど使いません。
CPANのFile::Sortモジュールがmerge sortのようです。
http://search.cpan.org/~cnandor/File-Sort-1.01/S …
あるいは、Cとかのソースは見付かるので、自分で作ってもいいでしょう。
いつもアドバイスありがとうございます。
File::Sortモジュールについて少し調べてやってみようと思いましたが、うまくいきませんでした。
サーバーがこのモジュールがないのかもしれませんので確認をしてみようと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Perlのエラーについてご教授く...
-
perlについての質問
-
INDIRECT 横に再度抽出したい
-
openした後、closeしないでプロ...
-
テキストファイルで提出とは?
-
検索ボックスから製品名を検索...
-
perl の open について教えてく...
-
Perl言語について。
-
ファイルをディレクトリ分配の...
-
アルファベットに付いて質問し...
-
#!/usr/bin/perlで書きだしたCG...
-
perlのflock関数でロックをかけ...
-
AI sisterとは、偽物の人ですか?
-
bashスクリプト
-
ファイルアイコンの左下に緑の□...
-
perlプログラミング 空白行削除
-
perlでリテラル値はメモリにど...
-
perlで2次元配列をサブルーチ...
-
Perlで時間の計算
-
perlについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
where can I buy snowbord in t...
-
close()で例外が投げられる理由
-
改行コードが勝手に
-
perlのflock関数でロックをかけ...
-
open中のファイルをrename
-
telnet接続
-
cgiログファイルの書き込みに余...
-
ファイルから読み込んだ文字を
-
die関数のエラー出力先について
-
テキストファイルの本文中に行...
-
ジョブショップスケジューリング
-
GD.pmで作成した画像を保存する...
-
巨大ファイルの行をを逆順に並...
-
ファイルの入出力
-
ExcelをCSV書き出す場合のシー...
-
エクセルVBA コードが同じでも...
-
awkスクリプトでダブルクォーテ...
-
batファイルでrenameができませ...
-
VBAでCSVファイルを途中行まで...
-
Windowsで複数のファイルを同じ...
おすすめ情報