我正在使用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
的参数,如果我尝试使用engine_kwargs
传递constant_memory
:
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
而不会收到弃用警告,因为它似乎可以解决我的问题?
3条答案
按热度按时间nqwrtyyt1#
当你收到弃用通知时,将xlsxwriter选项传递给Pandas的正确语法是:
请参阅XlsxWriter文档的这一节。
然而,正如你在问题中指出的,从你的观察来看,
constant_memory
选项不适用于Pandas,因为它要求数据按行顺序写入,而Pandas使用的是按列顺序写入。但是,需要明确的是,
constant_memory
选项只会减少应用程序使用的“内存”。它不会使文件的大小变小(事实上,如果文件包含大量字符串数据,它通常会使文件变大)。它可能只能通过“解决”您的问题,因为它只向文件写入一列数据,因此文件比预期的要小得多。mec1mxoz2#
我不是Maven,不管怎样,你试过吗
?
velaa5lx3#
我不是Maven,不管怎样,你试过吗
直接使用xlsxwriter而不是pandas