- ベストアンサー
perlで容量の大きいCSVファイルを開く方法
- ファイル容量の大きいCSVファイルを開く方法について紹介します。
- CSVファイルから必要な項目を抜き出して別ファイルにするプログラムを作成する際、容量の大きいファイルを処理する方法について解説します。
- ファイル容量が140MBを超えるような大きなCSVファイルを読み込む際にブラウザー表示ができない問題について解決策を提案します。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
質問者さんのコードは > @lines = <IN>; ここで、ファイルの全データを変数に読み込んで > foreach $lines (@lines) { これで、データを1つづつ取り出す という処理になっていますので、「@lines=<IN>」の時点でメモリを大量に消費します。この2行の代わりに > while ($lines = <IN>) { とすれば、ファイルから1行ずつデータを読んで処理するようになりますので、 ファイルサイズが大きくても処理できるようになります。 ただし、そうやったとしても、 > $dat .= "$val[1]\,$val[5]\n"; この部分で変数 $dat のサイズがどんどん大きくなりますから、そちらの分のメモリ消費は入力ファイルサイズに比例します。 --- open(IN,"$inport") || &error(" $inport を読み込みopen出来ません"); flock(IN,1); open(OUT,">$dcsv"); flock(OUT,2); while ($lines = <IN>) { local(@val) = split("\,", $lines); print "$val[0]"; print OUT "$val[1]\,$val[5]\n"; } close IN; close OUT; --- とすれば、完全に入力ファイルサイズに依存しないようになります。
その他の回答 (1)
- kuroizell
- ベストアンサー率55% (95/170)
foreach → whileに変更でいかがでしょうか。 foreachはファイルをすべてメモリ上に読み込みますが、 whileでは一行ごとに処理するので省メモリで済みます。
お礼
ありがとうございます。 早速やってみました。恐ろしいくらいのパフォーマンス向上ですね。
お礼
回答ありがとうございます。 具体的な方法までご指導いただきとても助かりました。 早速やってみたところ無事動作いたしました。 ありがとうございます。