我正在用xlsxwriter将数据写入xlsx。在xlsx 13万中有business_unit、creator_login_sap等列的总记录。business_unit和creator_login_sap是字符串。business_unit具有4个字符的恒定长度。creator_login_sap的平均长度为10个字符。
import xlsxwriter
import io
output = io.BytesIO()
wb = xlsxwriter.Workbook(output)
ws = wb.add_worksheet()
columns = ['business_unit', 'creator_login_sap', ...]
data = [('BU01', 'ALNUDOVAN00'), ...]
for col_idx, column in enumerate(columns):
ws.write(0, col_idx, column)
for row_idx, row in enumerate(data, 1):
for col_idx, value in enumerate(row):
ws.write(row_idx, col_idx, value)当我试图缩小文件大小时,我注意到business_unit和creator_login_sap列的重量几乎相等(~450 Kb)。这个事实让我很困惑。
为什么会发生这种事?也许有一种更短的字符串占用更少内存的方法?
发布于 2022-11-30 10:38:40
数据已经被压缩了。xlsx是一个包含XML文件的ZIP包。450 in中的130 k行小于每行4字节。具有相同数据的文本文件将为1.8MB。这是一个令人印象深刻的压缩25%的原始大小。
尽管如此,可能还可以进一步缩小规模。您可以通过在Excel中打开该文件并将其保存到另一个文件来测试该文件。如果结果较小,就有改进的余地。Excel应用程序广泛使用共享字符串,以确保文件尽可能小。它不是在单元格中存储可能重复的字符串,而是将它们存储在共享字符串资源中,并在单元格本身中存储对共享值的引用。
xlsxwriter已经使用共享字符串来缩小大小。其他库不这样做,导致文件更大。
如果您想以牺牲压缩大小为代价来减少RAM的使用量,则可以使用constant_memory模式。这在使用内存和性能中得到了解释。此模式通过刷新每一行而不使用共享字符串来使用较少的内存。另一个限制是,它不允许您在数据写入之后修改数据,这会导致格式化限制。
wb = xlsxwriter.Workbook(output,{'constant_memory': True})
...从医生那里:
使用“constant_memory”模式时的折衷之处是,在编写单元数据之后,您将无法利用任何操纵单元数据的新功能。目前,add_table()方法在这种模式下无法工作,而merge_range()和set_row()只适用于当前行。
请不要无缘无故地“优化”
我目前正在处理包含2K行和1M空单元格的文件。不知怎么的,在某个地方,有人试图“优化”一些东西,最终产生了一个5MB的文件,尽管几乎没有数据,但是Pandas必须完全处理这个文件。用Excel重新生成这样一个10的文件会产生一个50的文件。
因此,在急于“优化”任何内容之前,请考虑一下该文件的使用者。
https://stackoverflow.com/questions/74625551
复制相似问题