阅读,格式化,然后编写大型CSV文件

时间:2017-05-22 22:16:46

标签: python-3.x csv multiprocessing generator bigdata

我有相当大的csv文件,我需要逐行操作/修改(因为每行可能需要不同的修改规则)然后用正确的格式将它们写出到另一个csv。

目前,我有:

import multiprocessing

def read(buffer):
    pool = multiprocessing.Pool(4)
    with open("/path/to/file.csv", 'r') as f:
        while True:
            lines = pool.map(format_data, f.readlines(buffer))
            if not lines:
                break
            yield lines

def format_data(row):
    row = row.split(',') # Because readlines() returns a string
    # Do formatting via list comprehension
    return row

def main():
    buf = 65535
    rows = read(buf)
    with open("/path/to/new.csv",'w') as out:
        writer = csv.writer(f, lineterminator='\n')
        while rows:
            try:
                writer.writerows(next(rows))
            except StopIteration:
                break

即使我通过map使用多处理并使用生成器防止内存过载,但仍需要2分钟才能处理40,000行。老实说,不应该那么多。我甚至从生成器输出生成了一个嵌套列表,并尝试一次将数据写为一个大文件,这是一个逐块的方法,但仍需要很长时间。我在这里做错了什么?

1 个答案:

答案 0 :(得分:0)

我已经弄清楚了。

首先,问题出在我的style函数中。它正在调用一个数据库连接,每次运行时,它都会构建数据库连接并在每次迭代时关闭它。

我通过字典创建基本映射来修复它,以获得支持多线程的指数级更快的查找表。

所以,我的代码看起来像这样:

<div class="bubble" [ngStyle]="{'margin-left': bubble[0]}">

我能够在不到30秒的时间内解析~150MB的文件。这里学到的一些经验教训可供其他人学习。