あまりファイルサイズの大きな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がムリポじゃね?」ってことなのかも。