如何阅读超过25GB的巨型二进制文件?

2024-09-30 18:35:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我有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变量中?在

并行计算可以解决这个代码吗?在

我将等待你的评论。非常感谢。在


Tags: 文件数据代码readdatatimeparamresult
1条回答
网友
1楼 · 发布于 2024-09-30 18:35:37

这是你的问题:

MergerQ = []+Halo

清除MergerQ,将其置于循环之外:

^{pr2}$

但是不要期望有足够的内存来存储整个文件如果你的文件那么大,你将需要大量的内存和大量的时间。

编辑

很有可能的是,你可以成功地运行你的代码,而不需要你的操作系统将它存储在你的硬盘上,当需要的时候获取它,但这将大大增加运行时间。在

试着运行这个代码片段,看看会发生什么(警告:如果您让这个运行太久,您的机器将变得无响应,很可能需要物理重置

a = []
while 1:
    a = [a, a]

希望脚本的反应类似。在

相关问题 更多 >