我有相当大的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行。老实说,不应该那么多。我甚至从生成器输出生成了一个嵌套列表,并尝试一次将数据写为一个大文件,这是一个逐块的方法,但仍需要很长时间。我在这里做错了什么?
答案 0 :(得分:0)
我已经弄清楚了。
首先,问题出在我的style
函数中。它正在调用一个数据库连接,每次运行时,它都会构建数据库连接并在每次迭代时关闭它。
我通过字典创建基本映射来修复它,以获得支持多线程的指数级更快的查找表。
所以,我的代码看起来像这样:
<div class="bubble" [ngStyle]="{'margin-left': bubble[0]}">
我能够在不到30秒的时间内解析~150MB的文件。这里学到的一些经验教训可供其他人学习。