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で質問しましょう!
似たような質問が見つかりました
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- C言語・C++・C# メインプログラムに#include <algorithm>を書いて、 そのメインプログラムが // 3 2023/05/02 11:24
- その他(プログラミング・Web制作) sortの優先キーについて(スプレッドシート) 1 2023/01/17 17:59
- Excel(エクセル) エクセルのVBAについて とあるサイトのコードを参考に、CSVの文字化けを直すVBAを作成しているの 7 2022/11/04 14:15
- その他(プログラミング・Web制作) データ解析ソフトRでのファイル入力read.csvがエラーになります 7 2022/03/27 22:11
- 英語 The majority of currently available reviews focus 8 2022/08/07 05:55
- Visual Basic(VBA) エクセルVBAについて 8 2022/07/13 22:41
- Excel(エクセル) 【マクロ】webアドレスにて指定されたCSVファイル【excelソフト表示】を印刷する件 1 2023/02/15 01:52
- Excel(エクセル) CSVファイルでVBAを動かす方法 3 2023/04/04 10:22
- その他(Microsoft Office) Excel関数での質問です 1 2022/11/22 13:06
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
close()で例外が投げられる理由
-
perlを用いた特定文字列間の抽...
-
パスワード自動生成スクリプト...
-
巨大ファイルの行をを逆順に並...
-
perlで複数のファイルの処理に...
-
オープンしたファイルで行の連結
-
テキストファイルの本文中に行...
-
die関数のエラー出力先について
-
ディレクトリ名を取得したい
-
VBAでCSVファイルを途中行まで...
-
window.open でのファイル指定方法
-
awkスクリプトでダブルクォーテ...
-
一行だけ読込
-
VBAでCSVファイルの特定行を書...
-
htaccessで特定のディレクトリ...
-
ファイル全てを .xlsm に変更し...
-
バッチファイルの作り方(CSV→...
-
Perlで フォルダ内の全て...
-
一定時間が経過したフォルダの削除
-
無料配布の郵便番号自動入力cgi...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
close()で例外が投げられる理由
-
perlのflock関数でロックをかけ...
-
改行コードが勝手に
-
巨大ファイルの行をを逆順に並...
-
オープンしたファイルで行の連結
-
Perl で syntax error
-
where can I buy snowbord in t...
-
perlを用いた特定文字列間の抽...
-
Perlで他サイトの情報を取得し...
-
open中のファイルをrename
-
die関数のエラー出力先について
-
ハッシュにファイルハンドル
-
perlで大容量CSVのsort方法につ...
-
テキストファイルの本文中に行...
-
サブスクリプトとのファイルハ...
-
AutoCADのスクリプト
-
フォルダが開かなくなりました。
-
ジョブショップスケジューリング
-
バッチファイルの作り方(CSV→...
-
awkスクリプトでダブルクォーテ...
おすすめ情報