我有一个大约5 GB(约有720万棵树)的巨大文件,其中包含粒子ID(第一列)和时间(第二列),如下所示,它告诉我们粒子的ID是如何演变的
#Tree 0, Nbranches=2
1544212658 -1.0000
#Tree 1, Nbranches=2
2147749983 -1.0000
#Tree 2, Nbranches=7
1644822649 -1.0000
1611272315 17.6766
1594523770 10.2310
1661603959 10.0127
1661624438 10.7100
#Tree 3, Nbranches=8
252530795 -1.0000
319647854 10.7497
...
我有一个ID列表作为列表的形式,我希望跟踪上述文件。我写了一个代码,它适用于我制作的一个小数据集,但每次我使用实际数据集(在我的大学集群上)运行它时,代码都会循环。我包含了一个print语句来跟踪代码的进度,我可以注意到,当它遇到大约第720万棵树时,它会再次从Tree 0
开始。令我感到困惑的是,我根本不明白为什么代码循环,任何人都可以看到代码中的任何逻辑falacies?谁能帮我这个?感谢
代码:
import numpy as np
pid=[]
pid_pass=[]
ids=np.loadtxt('C:\\Users\\Nin\\Downloads\\gg\\100kpc_cumulative_halo_ids.txt') #list of initial
halos as a list
id_final=[]
with open('C:\\Users\\Nin\\Downloads\\Sel_merg_hist.txt','r') as inf:
for line in inf:
if line.startswith("#"):
print line
del pid[:]
else :
parts = line.split() # split line into parts
pid.append((int(parts[0]),float(parts[1])))
for i in range(len(ids)):
if ids[i]==int(parts[0]) and float(parts[1]) == -1 :
id_final.append(int(parts[0]))
pid_pass.append(ids[i])
elif ids[i]==int(parts[0]) :
id_final.append(pid[0][0])
pid_pass.append(ids[i])
id_left=list(set(ids).difference(set(pid_pass))) #list of ids not used, which didn't merge until after z=10
id_left= map(int,id_left) #convert float to int to get rid of .0
id_final=id_final+id_left
file = open("100kpc_final_ids.txt", "w")
for index in range(len(id_final)):
file.write(str(id_final[index]) + "\n")
file.close()
感谢@szym,似乎主循环读取文件的每一行都没有退出,它继续循环。知道为什么会这样吗?