Spreadsheet::ParseExcel::SaveParser 和 Spreadsheet::ParseExcel的内存问题

来源:互联网 发布:淘宝海报图片男装 编辑:程序博客网 时间:2024/05/22 14:58


     最近在使用perl处理Excel文件,到功能全部完成的时候发现s::pe::sp和s::pe的一个很严重的问题就是内存释放问题。在处理130+M的excel文件的时候,内存的使用量竟直线达到1G+,并继续上升。在CPAN上多方查证后更加郁闷,原来迄今为止此问题依旧未能解决。
     此问题的关键是每次PARSE之后的memory不能释放,由于引用数不为0,很自然perl也不会来释放这段内存,于是每次解析一个文件之后就会有一部分内存空间被占用并且程序结束前不能收回或重用。而是用undef释放Workbook之后,释放的却只是Workbook变量本身所占用的内存,而它所指向的内存模块则未被释放。再后来我发现,原本用于调试的输出信息的数目太多的时候,其消耗的时间和内存的数量也是相当可观的,在处理十几个excel文件所输出的信息,达到了60w-70w行,产生的消耗也就可想而知,所以建议在不必要的情况下,建议尽量少用屏幕和文件输出。在后来我终于发现了一个对内存消耗改进较大的方法,就是自己修改s::pe的模块,在读取excel文件的时候,只读取Value,而不读取format。就我处理的excel文件而言,内存的占有率几乎减少了一半,当然这与我处理的excel文件的cellformat相对复杂有关,不过这样的改变对于在unix下进行大量的数据库和excel处理来说是很不错的。如果真的有人实在没办法必须接受需要perl处理excel这种变态要求的时候,面对的又是大量的excel数据处理,那么不妨可以考虑用一下这个方法,具体的修改可以在CPAN的Spreadsheet::ParseExcel模块的View/Report Bugs里查找一下,或许能够解决一些问题。
  而对于我来说,这种减少还是不够的,因为对不可知的数据来说,随时会有硬件无法承受的问题的出现,因此我所能做的是继续痛苦的思索。可是经过长时间的痛苦思索,限于我对perl了解的局限性,终于还是没有找到什么好的办法。不过由于perl在运行完之后,所有占用的空间都会释放,所以我将文件的预处理,excel文件内部数据的处理及其与数据库连接后的数据分析分开来,每次调用解析连接文件来处理一部分excel文件,然后结束操作,在进行下一批文件的处理,虽然会牺牲一些性能,可是对于大量的文件读些和数据库连接来说,相对还是不错的选择,而且内存的使用肯定会保持在一个范围之内,而不必担心面对更大量处理的时候会有任何危险的产生.
  经过一段时间perl的学习和使用之后,我慢慢发现使用少人问津的模块的时候是怎样痛苦的一件事,不过对于有时间的初学者来说,也是不错的自我提高的机会.至此,excel的内存问题总算有了一些解决的方法,至于怎么解决,还是要结合实际情况来看了.