0

私の現在のコード:

$fileone= fopen("fileone.sql", "r"); //opens file fileone.sql
$fileonewrite = fopen("fileone.rdf", "w"); //this is the file to write to

$fileNum=1;
$i=0;
while (!feof($fileone) ) { //feof = while not end of file


    if ($contents = fread($fileonewrite ,53687091200));  //if file is more than 50gb, write to new file (below) .. this doesnt seem to work properly
    {    file_put_contents('fileone'.$fileNum.'.rdf',$contents);
    $fileNum++; 
    }

    $fileoneRow[] = fgets($fileone);  //fgets gets line
    $fileoneParts = explode("\t", $fileoneRow[$i]); //explode using tab delimiter 



    fwrite( " lots of stuff" );
     unset($fileoneParts);
    }
    fclose($fileonetype);   
    fclose($fileonewrite);

大量のデータを読み取り、さらに多くのデータを出力すると、作成されるファイルは最大200GBになります。これにより、メモリの問題が発生します。ですから、私がやりたいのは、書き込み中のファイル(fileone.rdfなど)が50 GBに達したときに、filetwoへの書き込みを開始したいということです。私のコードatmは、何千もの空のファイルを出力しているように見えるため、うまく機能しません。

いつものように、私の質問を読んでくれてありがとう、どんな助けでも大歓迎です。

4

1 に答える 1

2
if ($contents = fread($fileonewrite ,53687091200));  //if file is more than 50gb, write  to new file (below) .. this doesnt seem to work properly
                                                  ^----BUG BUG BUG
{    file_put_contents('fileone'.$fileNum.'.rdf',$contents);
$fileNum++; 
}

これ;でif()ステートメントが終了するため、内のコードはif()の一部で{}はありません。freadがデータ(eof)を返さない場合でも、if()テストがどのように行われたかに関係なく、ファイルから空の$contentsを書き込んでいます。

50ギガのデータを一度に読み取るのは非常識です。これらの線に沿ってもっと何かをしてみませんか:

$in = fopen('input');
$out = fopen('output');
$read = 0;
while($data = fread($fh, 1024*1024)) { // read in 1meg chunks 
    fwrite($out, $data);
    $read += strlen($data);
    if ($read > 50gig) {
        fclose($out);
        $out = fopen('new file goes here');
        $read = 0;
    }
}

これにより、1メガのチャンクでコピーが実行され、システムメモリへの負担が大幅に軽減され、最終的に50ギガのコピーに達したときに新しいファイルにスワップされます。

于 2013-02-15T18:27:55.603 に答える