【问题标题】:PHP/Symfony: Writing to CSV large filePHP/Symfony:写入 CSV 大文件
【发布时间】:2018-06-13 03:40:50
【问题描述】:

感谢您的帮助。

我的规格:

  1. 我有一个非常大的 CSV 文件
  2. 我需要处理文件并输出另一个大的 CSV 文件

我的环境:

  1. php7.0
  2. Symfony 3.4 框架

我目前的解决方案:

我正在使用Symfony Serializer 组件读取我的文件,然后处理我的文件并输出文件。都在记忆中。操作大约需要 20 分钟才能完成。

我从 Symfony 命令运行脚本。我有一个读取文件的服务和一个导出文件的服务。

改进的解决方案 1:

  1. 我可以像here 解释的那样,使用“LOAD DATA LOCAL INFILE”sql 查询将 CSV 文件加载到数据库表中。操作非常快
  2. 然后我可以处理我的数据并将其保存到另一个表中
  3. 然后我会使用“SELECT ... INTO OUTFILE 'file_name'”来输出文件

优势: -以SQL为中心 - 没有内存问题

缺点: -处理期间的数据库操作可能很昂贵

改进的解决方案 2:

  1. 我可以逐行读取CSV文件
  2. 我处理这条线
  3. 我将这一行写入输出文件

Adv:没有内存问题 Disav:可能需要很多时间。

改进的解决方案 3:

  1. 我可以像 here 解释的那样将 CSV 文件加载到数据库表中,使用“LOAD DATA LOCAL INFILE”sql 查询。操作非常快
  2. 然后我可以以 1000 个为单位处理我的数据并将它们写入文件

您会使用什么解决方案?或者您有什么更好的解决方案?

【问题讨论】:

  • PHP 具有逐行流式传输 CSV 文件的内置函数,因此不确定您为什么要使用其他任何东西。见fgetcsv()。另请参阅fputcsv() 写入磁盘

标签: php symfony csv


【解决方案1】:

解决方案 2,没有数据库。从 csv 读取,处理并输出到 csv,就像在 cmets 中提到的那样,使用 fgetcsv()fputcsv()。逐行进行应该几乎不会消耗任何内存,并且它将消除中间对数据库的需求。这些类型的操作的问题在于将 csv 文件作为流读取的顺序性质,最终该过程的速度将归结为在读取和写入操作之间对数据进行操作的速度。在两者之间使用数据库只会减慢整个过程并且有些浪费。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-10
    • 1970-01-01
    相关资源
    最近更新 更多