【问题标题】:Converting single sheet in an XLS file to CSV with PHPExcel - Memory exhausted使用 PHPExcel 将 XLS 文件中的单个工作表转换为 CSV - 内存耗尽
【发布时间】:2015-09-04 11:52:46
【问题描述】:

我有一个 Excel 文件 (97-2003),我需要能够通过 PHP 导入该文件并将文件中的一张表转换为 CSV。这些是由用户上传的,因此没有手动操作的选项。它需要与 PHP。

我目前正在使用 PHPExcel,它工作正常,直到我们得到一个超过 33,000 行的文件......这给出了一个致命的 PHP 错误:Fatal error: Allowed memory size of 1073741824 bytes exhausted (tried to allocate 97 bytes) in [pathtophpexcel]\PHPExcel\Worksheet.php on line 11231

有什么方法可以进一步优化它,或者 PHPExcel 在处理大型工作表时不适合使用?我使用的代码相当简单,所以不确定是否可以进一步优化它,但手指交叉!这是我正在使用的代码:

$reader = PHPExcel_IOFactory::createReader('Excel5');
$reader->setReadDataOnly(true);
$reader->setLoadSheetsOnly('Details');

$excel = $reader->load($filename);

$writer = PHPExcel_IOFactory::createWriter($excel, 'CSV');
$writer->save($filename_fixed);

如果 PHPExcel 不适合这项工作,我最好使用什么?

编辑 - 这是 Mark 建议后的工作代码

$cacheMethod = PHPExcel_CachedObjectStorageFactory::cache_to_phpTemp;
$cacheSettings = array( 'memoryCacheSize' => '2GB');
PHPExcel_Settings::setCacheStorageMethod($cacheMethod, $cacheSettings);

$reader = PHPExcel_IOFactory::createReader('Excel5');
$reader->setReadDataOnly(true);
$reader->setLoadSheetsOnly('Details');

$excel = $reader->load($filename);

$writer = PHPExcel_IOFactory::createWriter($excel, 'CSV');
$writer->save($filename_fixed);

【问题讨论】:

  • 您是否尝试过使用 PHP 的 Cell Caching 来减少其内存使用量?
  • 干杯@MarkBaker,效果很好!不确定您是否要将其发布为正确答案,我会将其标记为已回答?

标签: php memory optimization phpexcel


【解决方案1】:

PHPExcel 1.7.3 引入了cell caching 作为一种机制来减少在 PHP 内存限制内维护大型工作簿的内存使用量。单元缓存通过序列化单元数据以减小其大小,或允许单元数据保存在 PHP 内存之外,仅在“内存中”维护单元索引,从而降低内存使用量。但以性能为代价。

默认情况下,单元缓存会将所有单元存储在内存中以获得最佳速度;但其他缓存选项包括:

  • 压缩在内存中
  • 在内存中序列化
  • 在内存中序列化的 igbinary
  • 磁盘上的红色
  • APC
  • 内存缓存
  • wincache
  • phptemp
  • sqlite 或 sqlite3 数据库

它们之间的速度和内存使用情况会有所不同,并且还会根据操作平台和其他设置而有所不同,因此您需要确定在您自己的情况下使用哪个是最佳选择;但作为一般准则,内存使用效率越高,性能就越慢。 SQLite 选项是最近添加的,并且提供了最佳的内存使用率,因为即使“单元格索引”也没有在内存中维护,我目前正在测试一些更改,看看我是否可以提高 sqlite 的执行速度。

开发者文档的第 4.2.1 节介绍了用法

【讨论】:

  • 适用于我们需要的 phptemp 单元缓存。再次感谢!用“固定”版本更新了我的代码。
猜你喜欢
  • 2016-04-25
  • 1970-01-01
  • 1970-01-01
  • 2015-11-20
  • 1970-01-01
  • 2021-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多