使用PHP从1.3GB文本文件中提取文本的最佳方法?

Gri*_*iff 5 php file

我有一个1.3GB的文本文件,我需要从PHP中提取一些信息.我已经对它进行了研究,并提出了一些不同的方法来做我需要做的事情,但总是稍微澄清一下哪种方法最好或者另一种更好的方法存在我不知道的事情?

我在文本文件中需要的信息只是每行的前40个字符,文件中有大约1700万行.每行40个字符将插入数据库中.

我的方法如下;

// REMOVE TIME LIMIT
set_time_limit(0);
// REMOVE MEMORY LIMIT
ini_set('memory_limit', '-1');
// OPEN FILE
$handle = @fopen('C:\Users\Carl\Downloads\test.txt', 'r');
if($handle) {
    while(($buffer = fgets($handle)) !== false) {
        $insert[] = substr($buffer, 0, 40);
    }
    if(!feof($handle)) {
        // END OF FILE
    }
    fclose($handle);
}
Run Code Online (Sandbox Code Playgroud)

以上是每次读取每行并获取数据,我将所有数据库插入排序,在事务中一次执行50次插入.

下一个方法与上面的方法相同但是file()在执行foreach获取数据之前调用将所有行存储在数组中?我不确定这种方法,因为数组基本上有超过1700万的值.

另一种方法是仅提取文件的一部分,用未使用的数据重写文件,并在执行该部分之后使用header调用重新调用脚本?

在以最快速有效的方式完成这项工作方面,最好的方法是什么?或者有没有更好的方法来解决这个问题?

此外,我计划将此脚本与wamp一起使用,但是在测试中运行它时,即使将脚本时间设置为0,也会导致超时问题.有没有办法可以执行脚本运行而无需通过浏览器访问页面?

Mil*_*kov 5

到目前为止你还不错,不要使用"file()"函数,因为它最有可能达到RAM使用限制并终止你的脚本.

我甚至不会将内容累积到"insert []"数组中,因为这样会浪费RAM.如果可以,请立即插入数据库.

顺便说一句,有一个很好的工具叫做"cut",你可以使用它来处理文件.

cut -c1-40 file.txt
Run Code Online (Sandbox Code Playgroud)

你甚至可以将cut的stdout重定向到一些插入数据库的PHP脚本.

cut -c1-40 file.txt | php -f inserter.php
Run Code Online (Sandbox Code Playgroud)

然后inserter.php可以从php:// stdin中读取行并插入到DB中.

"cut"是所有Linux上都可用的标准工具,如果您使用Windows,可以使用MinGW shell,或者作为msystools的一部分(如果您使用git)或使用gnuWin32安装本机win32应用程序.