首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么短字符串占用的大小与两倍大的字符串相同?

为什么短字符串占用的大小与两倍大的字符串相同?
EN

Stack Overflow用户
提问于 2022-11-30 09:37:42
回答 1查看 32关注 0票数 2

我正在用xlsxwriter将数据写入xlsx。在xlsx 13万中有business_unitcreator_login_sap等列的总记录。business_unitcreator_login_sap是字符串。business_unit具有4个字符的恒定长度。creator_login_sap的平均长度为10个字符。

代码语言:javascript
复制
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_unitcreator_login_sap列的重量几乎相等(~450 Kb)。这个事实让我很困惑。

为什么会发生这种事?也许有一种更短的字符串占用更少内存的方法?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-11-30 10:38:40

数据已经被压缩了。xlsx是一个包含XML文件的ZIP包。450 in中的130 k行小于每行4字节。具有相同数据的文本文件将为1.8MB。这是一个令人印象深刻的压缩25%的原始大小。

尽管如此,可能还可以进一步缩小规模。您可以通过在Excel中打开该文件并将其保存到另一个文件来测试该文件。如果结果较小,就有改进的余地。Excel应用程序广泛使用共享字符串,以确保文件尽可能小。它不是在单元格中存储可能重复的字符串,而是将它们存储在共享字符串资源中,并在单元格本身中存储对共享值的引用。

xlsxwriter已经使用共享字符串来缩小大小。其他库不这样做,导致文件更大。

如果您想以牺牲压缩大小为代价来减少RAM的使用量,则可以使用constant_memory模式。这在使用内存和性能中得到了解释。此模式通过刷新每一行而不使用共享字符串来使用较少的内存。另一个限制是,它不允许您在数据写入之后修改数据,这会导致格式化限制。

代码语言:javascript
复制
wb = xlsxwriter.Workbook(output,{'constant_memory': True})
...

从医生那里:

使用“constant_memory”模式时的折衷之处是,在编写单元数据之后,您将无法利用任何操纵单元数据的新功能。目前,add_table()方法在这种模式下无法工作,而merge_range()和set_row()只适用于当前行。

请不要无缘无故地“优化”

我目前正在处理包含2K行和1M空单元格的文件。不知怎么的,在某个地方,有人试图“优化”一些东西,最终产生了一个5MB的文件,尽管几乎没有数据,但是Pandas必须完全处理这个文件。用Excel重新生成这样一个10的文件会产生一个50的文件。

因此,在急于“优化”任何内容之前,请考虑一下该文件的使用者。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74625551

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档