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)达到50gb 时,我想开始写入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。

一口气读取 50gigs 的数据简直是疯了。为什么不在这些方面做更多的事情:

$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;
    }
}

这将以 1meg 块的形式进行复制,这将对系统内存施加 FAR FAR FAR 更少的压力,然后在您最终达到 50gig 复制时交换到一个新文件。

于 2013-02-15T18:27:55.603 回答