【发布时间】:2018-06-29 14:37:07
【问题描述】:
我有一个包含超过 400 万行的文件,我想逐行读取,并对数据的第一个“列”执行操作。可能有重复的数据,我想确保我只执行一次这些操作,并且能够重新启动程序并从它停止的地方开始。
我的解决方案是解析该行,将值存储到一个列表中,然后“如果 x 不在列表中”执行操作,然后如果/当程序死亡/停止/被杀死时将该列表存储为泡菜。
但是脚本在运行几个小时后会出现段错误,我认为这是因为我在 checkFile 列表中存储了大量 MD5 和而烧毁了我的所有 ram。
因为文件太大(超过 400 万个条目),我需要一些快速查找的东西,希望有一个简单的解决方案。谢谢!
数据如下所示:6e5f6c90e6bf31c31283afb8dca93da8|mouse.gif|10102017
我当前的代码如下所示:
checkedFile = []
def readline(inFile):
print("Opening file: %s\n" % inFile)
try:
with open(inFile, "r") as inputFile:
for line in inputFile: # read in file line by line
fileHash, garbage = line.split("|",1)
if fileHash not in checkedFile:
checkedFile.append(fileHash)
checkit(fileHash) #
【问题讨论】:
-
checkit 是做什么的?如果您的文件大约 4MB,那么它应该没有任何问题... => python 中的列表和字符串只有 1 个限制,据我回忆,这是 RAM 大小。我希望你的 ram 更像是在 GB 范围内:-)
-
文件读取是作为迭代完成的,因此不太可能导致内存问题。所以要么是
checkedFile变得太大,要么是checkit导致了这个问题(不管那是什么?) -
它接受 fileHash 并对返回 json 的本地运行的 web 服务进行 REST 查找。我的假设是“checkedFile”变得越来越大。
-
“单一职责”的一个好做法是首先将完整的 inFile 加载到 checkedFile 中。之后遍历checkedFile并对每个元素进行checkit。在这种情况下,您知道 2 中的哪一个失败了。您能否也在这里获取完整的错误信息?
-
至少有两个问题:分段错误和你的
checkedFile的低效处理。列表中的成员资格测试非常低效。将其替换为checkedFile = set()(制作一组)并将checkedFile.append(fileHash)替换为checkedFile.add(fileHash)。这样至少你不会在簿记上浪费很多时间。
标签: python