【问题标题】:PHPExcel large data sets with multiple tabs - memory exhausted具有多个选项卡的 PHPExcel 大型数据集 - 内存耗尽
【发布时间】:2011-12-19 15:15:05
【问题描述】:

使用 PHPExcel,我可以单独运行每个选项卡并获得我想要的结果,但如果我将它们全部添加到一个 excel 中,它就会停止,没有错误或任何事情。

每个选项卡包含大约 60 到 8 万条记录,我有大约 15 到 20 个选项卡。所以大约 1600000 条记录被分成多个标签(这个数字可能还会增长)。

此外,我使用 .xlsx 扩展名测试了 .xls 的 65000 行限制,如果我运行每个选项卡它是自己的 excel 文件,则没有问题。

伪代码:

从数据库读取数据 启动 PHPExcel 进程 解析每个页面的数据(一些样式/格式,但不多) (使用公式 SUM 将每个数字字段值汇总到 Excel 底部的总计列中) 保存excel(xlsx格式)

我有 3GB 的 RAM,所以这不是问题,并且脚本设置为无超时执行。

我在多个项目中使用了 PHPExcel,并取得了很好的效果,但拥有如此大的数据集似乎是个问题。

每个人都有这个问题吗?解决?提示?等等……

更新:

关于错误日志 --- 内存耗尽

除了向盒子添加更多 RAM 之外,我还有什么其他技巧可以做的吗?

任何人都保存当前状态并使用新数据编辑 excel?

【问题讨论】:

  • 你检查你的错误日志了吗? php的内存限制是多少?脚本很可能会尝试分配超出允许范围的内存。
  • 废话错误日志---内存耗尽
  • 您可以将内存限制提高到可以正常工作的程度。如果它是一个特定的脚本,我看不到它会导致您的机器出现任何问题。例如ini_set('memory_limit', '32M');
  • 我有同样的问题......我将电子表格写入 xml 文件,然后使用 PHPExcel 转换为 xls / xlsx - 大文件失败......我的服务器中有 32 GB 内存并为其分配 10 GB (PHP) - 即使有这么多内存,它也无法写入大文件!
  • 那不是物理内存,而是你的php.ini中设置的memory_limit

标签: php performance phpexcel large-data


【解决方案1】:

我遇到了完全相同的问题,谷歌搜索没有找到有价值的解决方案。

由于 PHPExcel 生成对象并将所有数据存储在内存中,在最终生成本身也存储在内存中的文档文件之前,在 PHP 中设置更高的内存限制永远不会完全解决这个问题 - 该解决方案不能很好地扩展。

要真正解决问题,您需要“即时”生成 XLS 文件。这就是我所做的,现在我可以确定无论数据库返回多少(百万)行,“将 SQL 结果集下载为 XLS”都能正常工作。

遗憾的是,我找不到任何具有“drive-by”XLS(X) 生成功能的库。

我在 IBM Developer Works 上找到了这篇文章,它提供了一个关于如何“即时”生成 XLS XML 的示例: http://www.ibm.com/developerworks/opensource/library/os-phpexcel/#N101FC

对我来说效果很好 - 我有多张包含大量数据的工作表,甚至没有触及 PHP 内存限制。扩展性很好。

请注意,此示例使用 Excel 纯 XML 格式(文件扩展名为“xml”),因此您可以将未压缩的数据直接发送到浏览器。 http://en.wikipedia.org/wiki/Microsoft_Office_XML_formats#Excel_XML_Spreadsheet_example

如果您真的需要生成 XLSX,事情会变得更加复杂。 XLSX 是一个包含多个 XML 文件的压缩存档。为此,您必须将所有数据写入磁盘(或内存——与 PHPExcel 相同的问题),然后使用该数据创建存档。 http://en.wikipedia.org/wiki/Office_Open_XML

也可能“即时”生成压缩档案,但这种方法似乎非常复杂。

【讨论】:

  • 哇,好答案!我将不得不尝试一下并尝试回发一些结果。
  • 谢谢@kaii,对不起,我仍然需要测试这可能需要几周的时间,但如果它确实解决了我的问题,我会将其作为接受的答案。再次感谢您的努力,+1 来自我。是的,总是欢迎示例代码:)
  • 不是最好的代码,但它为您提供了一个粗略的示例:pastebin.com/k1LHbz3W
  • @PhillPafford 请问您(现在是两年后)是否能够解决您的问题?你有没有找到一个没有这个限制的 php-excel 库?
猜你喜欢
  • 2020-06-25
  • 1970-01-01
  • 2011-04-02
  • 1970-01-01
  • 1970-01-01
  • 2019-09-09
  • 2021-03-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多