将XLS文件中的单个工作表转换为CSV,PHPExcel-内存耗尽

将XLS文件中的单个工作表转换为CSV,PHPExcel-内存耗尽,php,memory,optimization,phpexcel,Php,Memory,Optimization,Phpexcel,我有一个Excel文件(97-2003),我需要能够通过PHP导入,并将文件中的一张图纸转换为CSV。这些都是由用户上传的,因此没有手动操作的选项。它需要使用PHP 我目前正在使用PHPExcel,它工作正常,直到我们得到一个超过33000行的文件。。。这是一个致命的PHP错误:致命错误:第11231行的[pathtophpexcel]\PHPExcel\Worksheet.PHP中允许的内存大小为1073741824字节(尝试分配97字节) 是否有任何方法可以进一步优化这一点,或者PHPExc

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

我目前正在使用PHPExcel,它工作正常,直到我们得到一个超过33000行的文件。。。这是一个致命的PHP错误:
致命错误:第11231行的[pathtophpexcel]\PHPExcel\Worksheet.PHP中允许的内存大小为1073741824字节(尝试分配97字节)

是否有任何方法可以进一步优化这一点,或者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不适合这份工作,我最好用什么

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

$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);

phpexcel1.7.3引入了
单元缓存
作为一种机制,以减少在PHP内存限制内维护大型工作簿时的内存使用。单元缓存通过序列化单元数据以减小其大小,或者允许单元数据保存在PHP内存之外,只在“内存”中维护单元索引,从而减少内存使用量;但要以性能为代价

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

  • 在内存中压缩
  • 在内存中序列化
  • 在内存中序列化的二进制文件
  • 磁盘上的红色
  • APC
  • 内存缓存
  • 温切奇
  • phptemp
  • sqlite或sqlite3数据库
它们之间的速度和内存使用情况各不相同,也会因操作平台和其他设置而不同,因此您需要确定在您自己的情况下使用哪一种是最好的选择;但是作为一个一般的指导原则,内存的使用效率越高,性能就越慢。 SQLite选项是最近添加的,它提供了最佳的内存使用率,因为即使“单元索引”也没有在内存中维护,我目前正在测试一些更改,看看是否可以提高SQLite的执行速度


开发人员文档的第4.2.1节介绍了使用情况

试试这段代码您是否尝试过使用PHP的单元缓存来减少其内存使用?Cheers@MarkBaker,效果非常好!不确定是否要将其作为正确答案发布,我会将其标记为已回答?适用于我们需要的phptemp单元格缓存。。再次感谢!用“固定”版本更新了我的代码。