有效地在PHP中创建大型csv文件

时间:2014-07-10 06:41:09

标签: php file csv

我必须使用PHP创建一个超过400 MB的大型csv导出文件。导出文件和PHP代码的初稿允许对性能进行一些猜测。

为了避免极长的处理时间,我应该专注于有效地创建导出文件并避免PHP array - 操作,因为它们在这种情况下太慢了。 “有效地创建文件”意味着:将大块文本附加到文件中的其他大块,每个大块都快速创建。

不幸的是,“大块”比线条更像是矩形。构建我的导出文件将从许多行开头开始,如下所示:

Title a, Title b, Title c \n
"2014",  "07",    "01" \n
"2014",  "07",    "02" \n
...

然后我必须在行的右边添加一个“矩形”文本:

Title a, Title b, Title c, extention 1, extention 2, extention 3 \n
"2014",  "07",    "01",    "23",        "1",         "null" \n
"2014",  "07",    "02",    "23",        "1",         "null" \n
...

如果我必须逐行进行此操作,它会让我再次放慢速度。所以我希望有一种方法可以在文件中添加“矩形”,就像在一些文本编辑器中一样。同样有用的是在PHP中使用大量文本缓冲区的具体体验,也可以工作。

因为它不是我的托管,我不确定我是否有权调用sed / akw。

所以问题是:从经验中可以获得如何有效处理PHP中的大csv文件(文件块操作,文件“矩形”操作)或者如何有效处理PHP中的大字符串缓冲区的建议?似乎没有字符串缓冲区的框架。

感谢您的关注:-)

注意:与此重复:https://stackoverflow.com/questions/19725129/creating-big-csv-file-in-windows-apache2-php

2 个答案:

答案 0 :(得分:5)

只需将所有数据放入某些SQL(即使SQLite对于此目的来说还不错),然后将其导出为CSV。

答案 1 :(得分:1)

对我的问题的答案/评论感到鼓舞,我写了一个简短的基准测试。

a)部分创建2个文件,每个文件有100万行,每行有100个字符。然后它将它们合并为第三个文件,逐行拉链:

line1_1 line2_1 
line1_2 line2_2 
line1_3 line2_3 

这就是RaphaelMüller的建议。

b)部分将100万行(与第1节中相同的大小)填入带有两列的MySQL表中。它首先填充第一列,插入100万个插入语句。然后,使用一个更新语句,它将填充第二列。像这样,我会用一个命令一步处理几行(问题中描述的“矩形”动作)。然后在表中将是准备好读出和下载的合并数据文件。

这就是Florin Asavoaie的建议。

  • 为了填充1个文件,其中100行每行100个字符,需要4.2秒。为了将两个文件合并到第三个文件中,需要10秒钟。

  • 为了通过单个插入语句填充每行100行的MySQL表,需要440秒。所以我没有测量第二步。

这是关于数据库或文件系统性能的最终结论。也许,数据库可以在主机上有一些自由优化(我没有)。

我认为现在假设这个性能顺序是安全的:

  1. RAM
  2. 文件系统
  3. 数据库
  4. 这意味着,如果您的RAM因为创建导出文件而在接缝处爆裂,请不要犹豫将其部分写入文件并合并它们而不需要花费太多精力来维护内存块。

    PHP不是提供复杂的低级内存块处理的语言。但最后,你不需要它。