4

非常に大きなデータベースにすばやくデータを取り込むために、大きな.SQLファイルを生成するプログラムを作成しました。PHPでスクリプトを作成しました。コーディングを始めたとき、私はfopen()fwrite()を使用していました。ファイルが大きくなりすぎると、プログラムは制御をシェルに戻し、ファイルは不完全になります。

残念ながら、「大きすぎる」の正確な大きさはわかりません。4GBくらいだったと思います。

この問題を解決するために、ファイルをstdoutにエコーしました。次のようにプログラムを呼び出したときにリダイレクトしました。

[root@localhost]$ php generatesql.php > myfile.sql

これは魅力のように機能しました。私の出力ファイルは約10GBになりました。

それでは、私の質問は次のとおりです。fopen()fwrite()は、生成できるファイルのサイズに関して、ファイルシステムによって制限されていますか?もしそうなら; これはPHPの制限ですか?これは他の言語でも起こりますか?

4

4 に答える 4

6

おそらく発生しているのは、基盤となるPHPビルドが32ビットであり、4GBを超えるファイルポインターを処理できないことです。この関連する質問を参照してください。

基盤となるOSは明らかに大きなファイルを保存できるため、stdoutを大きなファイルにリダイレクトできます。

ちなみに、SQLファイルは圧縮性が高い可能性が高いため、ファイルを作成するときにgzipfopenラッパーを使用してファイルを圧縮することを検討してください。

$file = 'compress.zlib:///path/to/my/file.sql.gz';
$f = fopen($file, 'wb');

    //just write as normal...
    fwrite($f, 'CREATE TABLE foo (....)');

fclose($f);

ダンプは元のサイズの何分の1かになり、zcatからの出力をSQLクライアント(mysqlなど)にパイプするだけで復元できます。

zcat /path/to/my/file.sql.gz | mysql mydatabase
于 2010-11-19T21:39:19.823 に答える
2

はいといいえ。直接制限されるfopen()またはfwrite()ではなく、ファイルであり、ファイルシステムによっては一部の次元を超えることはできません。ウィキペディアのファイルシステムの比較をご覧ください。

于 2010-11-19T21:33:58.440 に答える
0

スクリプトの実行に時間がかかりすぎてタイムアウトした可能性はありますか?

または、スクリプト内でメモリ制限に達している可能性はありますか?

于 2010-11-19T21:39:03.347 に答える
0

ファイルではなく、ストリームに2GBを超えるデータを書き込むことができます(ファイルのfseek内部ポインターがPHPの制限を超えており、ストリームは通常シークできないため)

<? $target = fopen('test.tar', 'w'); //this is a file, limited by php to 2GB $body = str_repeat("===", 1024 * 1024); while(true) fwrite($target, $test);

<? $target = popen('cat > test.tar', 'w'); //this is a stream, no limitation here $body = str_repeat("===", 1024 * 1024); while(true) fwrite($target, $test);

于 2016-07-01T15:54:13.663 に答える