プロが教えるわが家の防犯対策術!

fgetcsvであるCSVファイルを読み込む簡単なスクリプトを書いています。
動作はさくらインターネットのスタンダードプランで行っていますが
fgetcsvの第二引数の一回に読み込むバイト数は
最大何バイトまで可能というか問題ないでしょうか。

今は200000(約195KB)でも動きに問題はないです。
でもこの先容量は増える見通しです。
しかしサーバーのメモリか何かに一時的に蓄える構造だと思うので
あまり大きな数字だと、さくらさんに負荷を与えてしまいそうで怖いです。

もちろん負荷がかかりそうなら、数回に容量を分けて処理することもできるのですが
一回でどのへんまで許容されるのかは知っておきたいです。

この辺はどう考えれば良いのでしょうか。
よろしくお願いします。

A 回答 (2件)

>> fgetcsvの第二引数の一回に読み込むバイト数は


>> 最大何バイトまで可能というか問題ないでしょうか。

第2引数は、integerの最大値まで設定自体は可能ですので
処理系によって異なります。32bitOSを使っているのなら
約2G(ギガ)バイト程度でしょう。正確には、
 echo PHP_INT_MAX;
を実行して御自身の処理系で調べてみてください。

但し、第2引数にどんな大きな値を設定しても1行ずつしか読み込みません。
1行に2Gバイトも有るcsvファイルは考えにくいのであまり意味は無いでしょう。
よって、メモリ使用量も第2パラメータでは無く 読み込むファイルの1行のサイズの
方に影響を大きく受けます。

メモリ使用量がご利用のホストでどこまで許されているかは、管理者の設定に依存するので
echo ini_get('memory_limit');
で確認してみては如何でしょう。その値までは管理者は利用を許可していることになります

また、メモリ使用量はfgetcsvだけでなくその前後のスクリプトにも依存しますので
fgetcsv部分にどこまで許容されるかは他の人には判定できません。

御自身の作成したスクリプトの最後に
echo memory_get_peak_usage();
を埋めばメモリをどの程度消費しているか確認できます
試しに 第二パラメータをいろいろ変えて (ちなみに、最大は0で無制限になります)
使用メモリの変化を確認し、memory_limit に対してどの程度余裕があるか確認しては
如何でしょうか。
    • good
    • 0
この回答へのお礼

初めまして
PHPはこのような事態にも便利な関数があるのですね。
memory_get_peak_usage();で値を変えながら様子を見ます。
多分この回答は他の方にも参考になると思います。
ありがとうございました。

お礼日時:2011/02/02 23:39

fgetcsv関数は、CSVのデータの一行を読み込むための関数ですので、


CSVデータとしての改行が含まれるところまでを一旦読み込みます。
<?php
while($row = fgetcsv($fp)){
//一行ずつ読み込むので繰り返し処理をする
}
?>
195KBで指定した場合は、一行に、半角で20万文字が含まれていても読めますよ、という指定なんですが、
さすがに一行にはそんなに文字数はないですよね?

また、マニュアルに、
http://www.php.net/manual/ja/function.fgetcsv.php

PHP5以降では第二引数を省略すると、どんなに長くても一行分は取得してくるとあるので、若干遅くなる可能性がありますが
指定しなくても良いのかな、と思います。

この回答への補足

連絡有り難うございます。処理構造の関係でカンマ、カンマと区切っていって一行で結構な長さになるのですが、流石に20万文字はないです。
なのでとりあえず第二引数を省略して様子を見ます。
参考になりました。

補足日時:2011/02/02 23:37
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!