我有N体模拟数据,必须用python读取该文件。在
它的大小超过25GB所以文件.read()不是因为缺乏记忆而工作。在
所以我就这样写了代码
with open("fullFoF_merger.cbin.z0.Run1", "rb") as mergertree:
def param(data):
result = {"nowhid":data[0], "nexthid":data[2],"zi":data[10],
"zip1":data[11], "F":data[4], "mass":data[9],
"dlnM":data[5],"dM":data[12], "dlnJ":data[6],"dJ":data[13],
"dlnspin": data[7], "spin":data[8],
"G":data[14], "overden":data[15]}
return result
num = 0
while 1:
num +=1
binary_data = mergertree.read(4)
if not binary_data : break
n_max = struct.unpack('I', binary_data)
binary_data = mergertree.read(64*n_max[0])
Halo = [None]*n_max[0]
for i in range(1,n_max[0]+1):
data = struct.unpack("4i12f", binary_data[64*(i-1):64*(i)])
Halo[i-1] = param(data)
MergerQ = []+Halo
print(MergerQ)
print(num)
print("\n Run time \n --- %d seconds ---" %(time.time()-start_time))
在此过程中,while循环在这段代码中计算了45470522次。但当我用python打印MergerQ时,它只显示一个字典数据,如下所示
^{pr2}$我认为这是由于内存不足或python变量的内存限制造成的。在
我怎样才能解决这个问题?在
有没有办法读取整个数据并保存在python变量中?在
并行计算可以解决这个代码吗?在
我将等待你的评论。非常感谢。在
这是你的问题:
清除
^{pr2}$MergerQ
,将其置于循环之外:但是不要期望有足够的内存来存储整个文件如果你的文件那么大,你将需要大量的内存和大量的时间。
编辑
很有可能的是,你可以成功地运行你的代码,而不需要你的操作系统将它存储在你的硬盘上,当需要的时候获取它,但这将大大增加运行时间。在
试着运行这个代码片段,看看会发生什么(警告:如果您让这个运行太久,您的机器将变得无响应,很可能需要物理重置)
希望脚本的反应类似。在
相关问题 更多 >
编程相关推荐