php并行进程或一个接一个的文件写入过程

时间:2010-09-29 14:37:56

标签: php

将数据导出到csv。在25000条记录之后,内存耗尽。 内存限制增加是可以的。

如果我有100000行,我可以将其写为4进程。 首先写25000行,接着写25000然后再写...

这在csv导出中是否可行? 这会有什么优势吗?或者这是相同的导出整个数据?

任何多处理或并行处理都有一些优势吗?

2 个答案:

答案 0 :(得分:0)

问题是如果你分叉过程,你必须担心清理它的孩子,你仍然使用相同数量的内存。最终你受到机器内存的限制,但是如果你不想根据迭代次数有条件地增加php memory_limit,那么分叉可能是最佳选择。

如果你使用--enable-pcntl--enable-sigchild编译PHP,那么你很高兴 - 否则,你将无法分叉这个过程。一种解决方法是使用一个主脚本来委派其他脚本的执行,但是如果你使用反引号或shell()exec()(或任何类似的东西)它会开始变得草率而且你会必须采取许多措施来确保您的命令不会被污染/利用。

答案 1 :(得分:0)

嗯,这取决于你如何生成CSV。

假设您是由于数据库查询(或其他一些导入)而执行此操作,您可以尝试流式传输而不是构建然后返回。

基本上,您首先关闭输出缓冲:

while(ob_get_level() > 0) {
    ob_end_flush();
}

然后,当你构建它时,逐行回显:

foreach ($rows as $row) {
    echo '"'.$row[0].'","'.$row[1].'"'."\n";
}

这样,你在PHP中没有使用太多内存。

您还可以将数据写入临时文件,然后将该文件流回:

$file = tmpfile();
foreach ($rows as $row) {
    fputcsv($file, $row);
}
rewind($file);
fpassthru($file);  // Sends the file to the client
fclose($file);

但同样,这一切都取决于你在做什么。听起来像你正在用字符串构建CSV(这会占用你所有的记忆)。这就是我建议这两个选项的原因......