Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP阅读&;解析大文件?_Php_File_Memory_File Get Contents_Fread - Fatal编程技术网

PHP阅读&;解析大文件?

PHP阅读&;解析大文件?,php,file,memory,file-get-contents,fread,Php,File,Memory,File Get Contents,Fread,我将要读取一个大小为200Mb的文本文件,然后编辑其中的内容,然后将其保存回去。但我有错误。因此: 在php中应该修改哪些确切的设置 还有什么文件读取方法是打开和解析大文件的最佳方法?我的意思是: 弗瑞德 文件\u获取\u内容 PHP不是设计或打算这样做的。您可能需要考虑使用Perl,或者将文本转换为XML,或者将其放入数据库。 按照预期的方式执行此操作意味着整个文件将加载到内存中。如果有多个用户在做同一件事,那么内存很快就会用完 对于XML解析,请看这里我必须做类似的事情,读取1GB文件

我将要读取一个大小为200Mb的文本文件,然后编辑其中的内容,然后将其保存回去。但我有错误。因此:

  • 在php中应该修改哪些确切的设置
还有什么文件读取方法是打开和解析大文件的最佳方法?我的意思是:

  • 弗瑞德
  • 文件\u获取\u内容

PHP不是设计或打算这样做的。您可能需要考虑使用Perl,或者将文本转换为XML,或者将其放入数据库。 按照预期的方式执行此操作意味着整个文件将加载到内存中。如果有多个用户在做同一件事,那么内存很快就会用完


对于XML解析,请看这里

我必须做类似的事情,读取1GB文件。我想继续使用PHP,所以最后我习惯于一点一点地阅读文件的部分内容:

while (!feof($source_file)) {
    $buffer = fread($source_file, 1024);  // use a buffer of 1024 bytes
    $buffer = str_replace($old,$new,$buffer);
    fwrite($target_file, $buffer);
}
这样,在任何给定时间,只有一小部分文件保存在内存中。我已经检查了效率 很好,整个文件大约需要半分钟

一个小提示-如果被替换的字符串位于缓冲区的末尾,则可能不会被替换。要确保已更改所有引用,请使用小偏移量再次运行脚本:

$buffer = fread($source_file, 512);
fwrite($target_file, $buffer);  
while (!feof($source_file)) {
    $buffer = fread($source_file, 1024);  // use a buffer of 1024 bytes
    $buffer = str_replace($old,$new,$buffer);
    fwrite($target_file, $buffer);
}

基本上与现有答案相同,但带有文件指针

$original = fopen("/tmp/inputfile.txt", "r");
$new = fopen("/tmp/outputfile.txt", "w");
if ($original && $new) {
    while (($buffer = fgets($handle)) !== false) {
        //do modification on $buffer (which is a single line)

        fwrite($new, $buffer);
    }

    fclose($original);
    fclose($new);
}

我使用以下方法来完成类似的任务:

$file = file_get_contents("/path/to/file");
$lines = explode("\n", $file);

$arr = preg_grep("/search_string/", $lines);

// $arr is now a smaller array of things to match
// do whatever here

// write back to file
file_put_contents("/path/to/file", implode("\n", array_merge($arr, $lines)));

你在这方面有什么错误?它们将大大有助于解决您的问题。您真的需要内存中的整个文件来解析它吗?如果没有,请使用
fread()
一次读取一行或几行,并使用
fwrite()
写入另一个(修改过的)文件。您是否尝试过使用(比方说)将文件分块读取?如果您明智地使用它,fread将起作用,您可以创建一个循环并只读取其中的一小部分,直到到达文件的末尾()。保存后,您可以使用fwrite进行操作。您的脚本应该如何处理文本文件,请提供更多详细信息。如果您的搜索字符串不止一个字符,这并不总是有效:)再次运行算法不是一个好选项,最好知道最大搜索字符串的长度,并保留前一个缓冲区的该部分,附加另一段,等等@Jack,你说得对:)我知道。。。。在我写了这个脚本之后,我在1GB文件上运行了它,不到1分钟。所以,是的,我本可以像你说的那样去做,花的时间也会少一些,但那30秒其实没那么重要。。如果效率比是更重要,那么你完全正确+1@Ja͢ck-很高兴知道这不是一个好的选择。但是你有什么建议吗?@mikoop上面的评论已经解释过了。。。如果搜索字符串的长度为10字节,那么在第二次循环之前,从缓冲区的末尾保留9个字节,并将其用作起始字节,然后是文件中的下一个X字节,等等。首先,将任何旧文本文件转换为XML并不一定有意义。我们不知道文本文件的来源或它们包含的内容,因此,如果必须使用PHP脚本动态执行,则将它们放入数据库也不一定是一个选项(如果我们能够读取文件来执行此操作,则问题已经解决)。@WesleyMurch使用PHP处理如此大的文件也没有意义。OP从未指定它必须是文本文件。我只是指出更好的选择。我不明白为什么会被否决。如果一开始有更多的信息,我可能不会建议。但我在回答中所说的一切都是真实的。这难道不会和OP有同样的记忆问题吗?