Pandas to excel using XLSX Writer - Constant Memory/In Memory

yi0zb3m4  于 2023-09-29  发布在  其他
关注(0)|答案(3)|浏览(128)

我正在使用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而不会收到弃用警告,因为它似乎可以解决我的问题?

nqwrtyyt

nqwrtyyt1#

当你收到弃用通知时,将xlsxwriter选项传递给Pandas的正确语法是:

writer = pd.ExcelWriter('pandas_example.xlsx',
                        engine='xlsxwriter',
                        engine_kwargs={'options': {'strings_to_numbers': True}})

请参阅XlsxWriter文档的这一节。

然而,正如你在问题中指出的,从你的观察来看,constant_memory选项不适用于Pandas,因为它要求数据按行顺序写入,而Pandas使用的是按列顺序写入。

但是,需要明确的是,constant_memory选项只会减少应用程序使用的“内存”。它不会使文件的大小变小(事实上,如果文件包含大量字符串数据,它通常会使文件变大)。它可能只能通过“解决”您的问题,因为它只向文件写入一列数据,因此文件比预期的要小得多。

mec1mxoz

mec1mxoz2#

我不是Maven,不管怎样,你试过吗

pd.ExcelWriter(output, engine_kwargs={'options': {"constant_memory": True}})

velaa5lx

velaa5lx3#

我不是Maven,不管怎样,你试过吗
直接使用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()

相关问题