現在位置: よかブロ > 糟屋郡新宮町周辺の情報 > 私的日記 > CSVを複数読み込む時は一気に配列に入れずにその都度fgetcsvで呼び出す

よかブロ
5月1日 20:06 - 新宮町 - 新宮町 ドアール美容室 【送迎サービス可】
勉強会〜

2013年8月12日 10:32 PM

CSVを複数読み込む時は一気に配列に入れずにその都度fgetcsvで呼び出す

記事のテーマ:私的日記

あまりファイルサイズの大きなcsvを読み込むとメモリが悲鳴を上げるので、分けれるものであれば分けて保存し、その都度必要な分だけ読み込めば無駄がありません(その分CPUのリソース食いそうだけど・・・)

一ページに数千、数万のデータ読み込んで使うことは滅多になく、”全て読み込んだ中からデータを選んで抜き取る”のであればそもそもその仕組み自体を見直す必要があるかもしれません。サーバーの負荷を考えず、とにかく簡潔にforやwhileを使って配列に詰め込んでやっていました・・・

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
if ($dir = opendir('csvDataDirectory')) {
//csvのディレクトリを開き・・・
while (false !== ($file = readdir($dir))) {
//ディレクトリの中を読み取り・・・
if(substr($file, -3) == "csv") {
//csvファイルだけを抜き取り
if( $handle = fopen( "./csvDataDirectory/".$file, 'r' ) ){
//csvのファイルを処理
$h=1;
while( ( $array = fgetcsv( $handle ) ) !== FALSE ){
for( $i = 0; $i < count( $array ); $i ++ ){
$newarray[substr($file, 0, 2)][$h][$i] = $array[$i];
//配列の中に無理やり全部突っ込む←ココがダメ!
}
$h++;
}
}
}	
}
closedir($dir);
}

emory_get_usage()で確認したら8,659,304バイト。(csvファイルは全体で2.3MB程度)その他の処理も合せたらおそらく10MB。shared serverでこれはダメです。今後データも増えてくるし・・・

csv自体を分割してその都度必要な分だけfgetcsv()で読み込むようにしました。設計する時点で予めトラフィックとサーバーの負荷を予測して「こうやって乗り越えよう!」ってやるんだろうけど、「そもそもPHPがムリポじゃね?」ってことなのかも。


にほんブログ村 地域生活(街) 九州ブログへ

あわせて読みたい