【发布时间】:2013-05-07 10:04:44
【问题描述】:
我正在编写一个脚本,它生成一个包含数百万个项目的列表,然后根据第一个列表生成另一个列表。它非常快地填满内存,脚本无法继续。 我认为将列表直接存储在文件中然后直接在文件行上循环可能是个好主意。 最有效的方法是什么?
编辑:
我正在尝试逐行生成树。 row5_nodes可以得到一百万个item,我不能删除,因为我用它来生成row6_nodes
import random
class Node:
def __init__(self, id, name, parent=None):
self.id = id
self.name = name
self.parent = parent
def write_roots(root_nodes, roots):
global index
index = 0
for x in xrange(0,roots):
node = Node(index,"root"+str(x))
root_nodes.append(node);
f.write(str(node.id)+","+str(node.name)+","+str(node.parent)+"\n")
index += 1;
return
def write_row(parent_nodes, new_nodes, children):
global index
for parent_node in parent_nodes:
for x in xrange(0,children):
node = Node(index,"cat"+str(parent_node.id)+"-"+str(x), parent_node.id)
new_nodes.append(node);
f.write(str(node.id)+","+str(node.name)+","+str(node.parent)+"\n")
index += 1;
return
f = open("data.csv", "wb")
roots = 1000
root_nodes =[]
row1_nodes =[]
row2_nodes =[]
row3_nodes =[]
row4_nodes =[]
row5_nodes =[]
row6_nodes =[]
row7_nodes =[]
row8_nodes =[]
row9_nodes =[]
write_roots(root_nodes, roots)
print "1"
write_row(root_nodes, row1_nodes, random.randrange(0,10))
print "2"
write_row(row1_nodes, row2_nodes, random.randrange(0,10))
print "3"
write_row(row2_nodes, row3_nodes, random.randrange(0,10))
print "4"
write_row(row3_nodes, row4_nodes, random.randrange(0,10))
print "5"
write_row(row4_nodes, row5_nodes, random.randrange(0,10))
print "6"
f.close()
【问题讨论】:
-
第二个进程是否需要随机访问第一个列表,还是可以按顺序处理项目?如果是这样,请使用生成器而不是在内存中实现列表。
-
最佳解决方案取决于您在构建列表后打算如何处理它们。可能值得详细说明您要实现的目标。
-
你是什么意思,将列表存储在文件中然后(稍后)再次循环遍历它的最有效方法是什么?我只能想到明显的解决方案来做到这一点。你试过什么?而且我同意,如果您仍然打算处理第一个列表,请直接执行,并且只将最终结果存储在内存之外。
-
您可以edit您的问题以包含更多信息。不要链接到要点,在您的帖子中包含代码,请参阅How do I format my code blocks? 以获取有关如何格式化您的代码以包含在内的帮助。
-
您要解决的问题是什么?你是什么意思“但是加载文件要快得多”。请描述您正在解决的问题,而不是就您想出的解决方案寻求帮助。
标签: python performance list memory file-io