从大cs创建词典列表

2024-09-29 23:21:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个非常大的csv文件(10gb),我想阅读它并创建一个字典列表,其中每个字典代表csv中的一行。 有点像

[{'value1': '20150302', 'value2': '20150225','value3': '5', 'IS_SHOP': '1', 'value4': '0', 'value5': 'GA321D01H-K12'},
{'value1': '20150302', 'value2': '20150225', 'value3': '1', 'value4': '0', 'value5': '1', 'value6': 'GA321D01H-K12'}]

为了避免任何内存问题,我尝试使用生成器来实现它,我当前的代码如下:

^{pr2}$

问题是,由于列表变得太大,进程被终止,所以基本上它耗尽了内存。 有没有一种方法可以有效地达到同样的结果(听写列表)?我对发电机/产量很陌生,所以我甚至不知道我是否正确地使用了它。在

我还尝试使用pypy的虚拟环境,但是内存无论如何都会中断(不过稍后)。在

基本上,我想要一个字典列表的原因是我想尝试使用fastavro将csv转换成avro格式,所以任何关于如何在不创建字典列表的情况下使用fastavro(https://pypi.python.org/pypi/fastavro)的提示都会很感激


Tags: 文件csv内存pypi列表字典代表fastavro
1条回答
网友
1楼 · 发布于 2024-09-29 23:21:19

如果目标是从csv转换为avro,那么就没有理由存储输入值的完整列表。这违背了使用发电机的全部目的。它看起来像是,在设置了一个模式之后,^{}'s ^{} is designed to take an iterable and write it out one record at a time,所以您可以直接将它传递给生成器。例如,您的代码将简单地省略创建list的步骤(注意:命名变量list是个坏主意,因为它隐藏/隐藏了内置名称list),而直接编写生成器:

from fastavro import writer

def csv_reader():
    with open('export.csv') as f:
        reader = csv.DictReader(f)
        for row in reader:
            yield row

    # If this is Python 3.3+, you could simplify further to just:
    with open('export.csv') as f:
        yield from csv.DictReader(f)

# schema could be from the keys of the first row which gets manually written
# or you can provide an explicit schema with documentation for each field
schema = {...}  

with open('export.avro', 'wb') as out:
    writer(out, schema, csv_reader())

然后生成器一次生成一行,writer一次写入一行。写入后将丢弃输入行,因此内存使用量保持最小。在

如果您需要修改行,您应该在yield生成程序之前修改row生成器。在

相关问题 更多 >

    热门问题