我正在使用 pandas 和
xlsxwriter
在 AWS lambda 中创建 Excel 报告。我一直遇到一个问题,即创建 60MB 区域内相当大的 excel 文件时,磁盘空间已满,但还有 512MB 的可用磁盘空间。
我一直在努力弄清楚发生这种情况的原因和原因,并且我发现了一个看起来很有前途的属性,我可以通过,
constant_memory
,所以我使用以下代码尝试了这一点:
with pd.ExcelWriter(output, options={"constant_memory": True}) as writer:
这似乎实际上确保了我的 lambda 始终如一地运行完成,如果我删除它,它就不再完成,但问题是我收到以下警告:
FutureWarning: Use of **kwargs is deprecated, use engine_kwargs instead.
with pd.ExcelWriter(output, options={"constant_memory": True}) as writer:
然后我读了一篇关于 SO 的文章,我认为这是
xlsxwriter
的作者提出的,表明这个属性在使用 pandas 时实际上不起作用。这一点很明显,因为我只得到了 Excel 报告中的第一列和 360000 行的最后一行。我很困惑如何通过这个来确保我的 lambda 完成0?为什么如果我不通过它,我的 lambda 就会耗尽磁盘空间?
第二个奇怪的事情是 pandas 的文档根本没有提到任何名为
options
的参数,如果我尝试使用 constant_memory
传递 engine_kwargs
:
with pd.ExcelWriter(output, engine_kwargs={'constant_memory': True}) as writer:
我收到以下错误:
TypeError: __init__() got an unexpected keyword argument 'constant_memory'
希望对xlsxwriter比较熟悉的人可以帮助我理解这几点。
xlsxwriter
的文档还提到了一个属性in_memory
,这似乎可以解决我的问题,但我无法将其传递给pd.ExcelWriter
:
TypeError: __init__() got an unexpected keyword argument 'in_memory'
**编辑:传递
in_memory
实际上解决了我遇到的问题,但我收到了弃用警告,使用 kwargs options
传递它。
with pd.ExcelWriter(output, options={"in_memory": True}) as writer:
FutureWarning: Use of **kwargs is deprecated, use engine_kwargs instead.
with pd.ExcelWriter(output, options={"in_memory": True}) as writer:
如何使用 pandas 将此属性传递给
xlsxwriter
而不会收到弃用警告,因为它似乎解决了我的问题?
当您收到弃用通知时,将 xlsxwriter 选项传递给 Pandas 的正确语法是:
writer = pd.ExcelWriter('pandas_example.xlsx',
engine='xlsxwriter',
engine_kwargs={'options': {'strings_to_numbers': True}})
请参阅 XlsxWriter 文档的部分。
但是,正如您在问题中指出的那样,从您的观察来看,
constant_memory
选项不适用于Pandas,因为它需要按行顺序写入数据,但Pandas使用逐列顺序.
但是,需要明确的是,
constant_memory
选项只会减少应用程序使用的“内存”。它不会使文件的大小变小(事实上,如果文件包含大量字符串数据,它通常会使文件变大)。它可能只能“解决”您的问题,因为它只将一列数据写入文件,因此文件比预期小得多。
我不是专家,无论如何,你尝试过吗
pd.ExcelWriter(output, engine_kwargs={'options': {"constant_memory": True}})
?
我不是专家,无论如何,你尝试过吗
直接使用xlsxwriter代替pandas
import xlsxwriter
workbook = xlsxwriter.Workbook('output.xlsx', {'strings_to_numbers': True, 'constant_memory': True, 'encoding': 'utf-8'})
worksheet = workbook.add_worksheet()
worksheet.write('A1', 'hello world')
workbook.close()