【问题标题】:how to handle large sets of data with PHP?如何使用 PHP 处理大量数据?
【发布时间】:2015-09-04 12:48:21
【问题描述】:

我的 Web 应用程序允许用户导入一个 excel 文件并将该文件中的数据写入 mysql 数据库。 问题是,当 excel 文件有很多条目,甚至 1000 行时,我得到一个错误,说 PHP 内存不足。这发生在读取文件时。 我在 php.ini 文件中为 PHP 分配了 1024MB。

我的问题是,如何在 PHP 中导入如此大的数据。

我正在使用 CodeIgniter。 为了读取 excel 文件,我使用this 库。


已解决。我使用 CSV 而不是 xls。我可以在几秒钟内导入 10,000 行数据。 谢谢大家的帮助。

【问题讨论】:

  • 增加内存限制?或者,更好的是,不要在 PHP 中处理大量数据——这不是它的设计目的。
  • PHP 的 1GB 内存太疯狂了......,但这个问题可能最好针对有问题的库提出。如果您必须使用该库来满足您的需求,那么处理大型数据集并不是您唯一的问题。
  • 我不会经常调用 1000 行,几分钟前导入了一个 60k 行的 csv 文件
  • 我会先保存它,然后使用 fopen 和 fread 分段解析它。否则,设置一个单独的服务,专门用于导入和设计一个队列系统,该服务可以读取和写入该服务可以在其中轮询作业并保存状态。
  • 您是在使用 PHPExcel(您已将其标记为好像)还是在使用 php-excel-reader?

标签: php codeigniter phpexcel


【解决方案1】:

正如其他人所说,1000 条记录并不多。确保您一次处理一个记录,或者一次处理几个记录,并且在您完成该行或重用变量后,您用于每次迭代的变量超出范围。

如果您可以通过将 excel 文件导出到 csv 来避免处理它们的必要性,那就更好了,因为您不需要这样的库(它可能有也可能没有自己的内存问题)。

如果需要,不要害怕增加内存使用量,这样可以解决问题,购买内存有时是最便宜的选择。并且不要让 1 GB 吓到您,对于这样一个简单的任务来说已经很多了,但是如果您有足够的内存并且这就是您需要做的一切,那么它就足够了。

另外,如果您使用的是旧版本的 PHP,请尝试更新到 PHP 5.4,它比以前的版本更好地处理内存。

【讨论】:

    【解决方案2】:

    而不是在循环中一次插入一个。一次插入 100 行。

    你总是可以运行

    INSERT INTO myTable (clo1, col2, col2) VALUES 
    (val1, val2), (val3, val4), (val5, val6) ......
    

    这样会减少网络事务的数量,从而减少资源使用。

    【讨论】:

      猜你喜欢
      • 2014-06-12
      • 1970-01-01
      • 2013-12-24
      • 1970-01-01
      • 1970-01-01
      • 2016-04-22
      • 2013-02-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多