8

我们正在使用 OpenPyxl 以 XSLX 格式将 MySQL 内容导出到 Microsoft Excel

https://bitbucket.org/ericgazoni/openpyxl/overview

但是,我们正在处理的数据量很大。我们正在运行内存不足的情况。表格最多可包含 50000 多行中的 400 列。即使文件很大,它们也没有 Microsoft Excel 或 OpenOffice 应该有问题的那么大。我们假设我们的问题主要源于 Python 以不够有效的方式将 XML DOM 结构保存在内存中的事实。

编辑:OpenPyxl 的作者 Eric 指出,有一个选项可以让 OpenPyxl 使用固定内存使用进行写入。然而,这并没有完全解决我们的问题,因为我们仍然存在原始速度问题以及在 Python 中占用过多内存的其他问题。

现在我们正在寻找更有效的方法来创建 Excel 文件。最好使用 Python,但如果我们找不到好的解决方案,我们可能还想看看其他编程语言。

选项,不按任何特定顺序,包括

1) 使用 OpenOffice 和 PyUno 并希望它们的内存结构比使用 OpenPyxl 更高效,并且 TCP/IP 调用桥足够高效

2) Openpyxl 使用 xml.etree。Python lxml(libxml2 本机扩展)是否会更有效地使用 XML 内存结构,是否可以直接用 lxml 插件替换 xml.etree,例如使用猴子补丁?(如果有明显的好处,以后可以将更改回馈给 Openpyxl)

3) 从 MySQL 导出为 CSV,然后使用 Python 和文件迭代将 CSV 文件直接后处理到 XSLX

4)使用其他编程语言和库(Java)

指针:

http://dev.lethain.com/handling-very-large-csv-and-xml-files-in-python/

http://enginoz.wordpress.com/2010/03/31/writing-xlsx-with-java/

4

2 回答 2

4

您是否尝试过查看 openpyxl 的优化编写器?这是一个最近的功能(2 个月前),但它非常强大(用于多个企业项目的生产中),并且可以处理几乎无限量的数据和稳定的内存消耗(大约 7Mb)

http://packages.python.org/openpyxl/optimized.html#optimized-writer

于 2011-04-18T11:58:35.570 回答
4

如果您要使用 Java,您将希望使用 Apache POI,但可能不是常规的 UserModel,因为您希望减少内存占用。

相反,请看一下BigGridDemo,它向您展示了如何使用 POI 编写一个非常大的 xlsx 文件,而大部分工作都不会发生在内存中。

您可能还会发现 BigGridDemo 中使用的技术同样可以在 Python 中使用?

于 2011-04-18T10:33:41.037 回答