我有一些代码,我正试图优化以提高效率。其中一部分是处理我的文件,在处理完每一行之后,立即将其写入csv
。这是理想的,因为我不会浪费内存,处理数据,然后将数据加载到一个列表中写出整个列表。如果我将整个处理过的数据添加到一个列表中,我可以毫不费力地将其写入csv
,如下所示,在# write folded_data to csv
下:
注意:数据处理下的代码是可靠的,我只需要在处理每一行时帮助我写出。
# data processing
seen = set()
folded_data = []
for u in name_nodes:
# seen=set([u]) # print both u-v, and v-u
seen.add(u) # don't print v-u
unbrs = set(B[u])
nbrs2 = set((n for nbr in unbrs for n in B[nbr])) - seen
for v in nbrs2:
vnbrs = set(B[v])
common = unbrs & vnbrs
weight = len(common)
row = u, v, weight
folded_data.append(row)
# write folded_data to csv
with ('out_file.csv', 'wb') as f:
writer = csv.writer(f)
writer.writerows(folded_data)
但是,当我试图在处理过程中写出每个row
时,我只得到第一行_文件.csv'. 在
我试着把我写的代码移到我想要的地方,但是我一直没能弄明白。在
我怀疑你得到的是第一行,最后一行。对于写出的每一行,都是重新打开文件,删除以前的内容。将文件打开,并在循环之外创建csv writer。在
在@etep和@MarkRansom的帮助下解决了这个问题!我必须打开文件并在整个
for-loop
之前定义writer
。在我不会担心“浪费”内存,除非您的程序要求(例如)大于系统内存的1/2。如果您的CSV在千兆字节范围(或更大),那么这是一个问题。在
如果你的csv不是这么大,除非你有一些非标准的内核设置,否则你的文件将在内存中的OS文件缓存中结束。在
为了以“高效”的方式(即不显式地将数据存储在内存中),您需要在for循环之前打开文件。在
相关问题 更多 >
编程相关推荐