• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:perlで容量の大きいCSVファイルを開く方法)

perlで容量の大きいCSVファイルを開く方法

このQ&Aのポイント
  • ファイル容量の大きいCSVファイルを開く方法について紹介します。
  • CSVファイルから必要な項目を抜き出して別ファイルにするプログラムを作成する際、容量の大きいファイルを処理する方法について解説します。
  • ファイル容量が140MBを超えるような大きなCSVファイルを読み込む際にブラウザー表示ができない問題について解決策を提案します。

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

  • ベストアンサー
  • mtaka2
  • ベストアンサー率73% (867/1179)
回答No.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; --- とすれば、完全に入力ファイルサイズに依存しないようになります。

hihin2003
質問者

お礼

回答ありがとうございます。 具体的な方法までご指導いただきとても助かりました。 早速やってみたところ無事動作いたしました。 ありがとうございます。

その他の回答 (1)

  • kuroizell
  • ベストアンサー率55% (95/170)
回答No.1

foreach → whileに変更でいかがでしょうか。 foreachはファイルをすべてメモリ上に読み込みますが、 whileでは一行ごとに処理するので省メモリで済みます。

hihin2003
質問者

お礼

ありがとうございます。 早速やってみました。恐ろしいくらいのパフォーマンス向上ですね。

関連するQ&A