想问一下,为什么这段代码内存占用不会降下来?

2016-03-22 20:42:19 +08:00
 yanyuechuixue

这是一部分代码,全部代码的话太长了。

    def main(rg1,rg2):
    global Abins
    Abins=[[[] for x in range(50)] for y in range(50)]
    for ra in range(rg1,rg2):
        for dec in range(180):
            print ra, dec
            if file_list[ra][dec] == []:
                continue
            else:
                print len(file_list[ra][dec])
                for b in file_list[ra][dec]:
                    for bins_ra in range(-4,5):
                        for bins_dec in range(-4,5):
                            for a in file_list[ra+bins_ra][dec+bins_dec]:
                                if a[4]<b[4]:
                                    calcute(str(a[0]),str(b[0]),a[3],b[3],a[1],b[1],a[2],b[2])
    print("start print")
    for i in range(FenShu):
        for j in range(FenShu):
            file_save=open('./Abins_'+str(rg1)+'_'+str(rg2)+'_'+str(i)+'_'+str(j), 'w')
            file_save.write(json.dumps(Abins[i][j]))
            file_save.close()
    del Abins
    gc.collect()


for ra in range(80,140):
    main(ra,ra+10)

这段代码的意思是,我每做一次 main 这个函数,都会往全局变量 Abins 数组中添加一些数据,由于全部做完之后这个数组会太大(远超过物理内存),所以每一次循环都输出一个文件。

但我的意图是输出完这个文件之后应该就释放了原来的 Abins 专用的内存了,不知道为什么执行的时候还是占用很多很多内存。 是做天文数据处理用的。 多谢!

3009 次点击
所在节点    Python
22 条回复
billgreen1
2016-03-25 21:03:45 +08:00
@yanyuechuixue

那就拆分,用 generator 。

假设天空 180*360 的格子 命名为 grids.

paired_array = ( (array1, array2)
for array1 in grid
for array2 in neighbor
for neighbor in get_neighbors(grid)
for grid in grids
)

result = [calculate(array1, array2) for array1, array2 in paired_array]
billgreen1
2016-03-25 21:06:18 +08:00
我猜你的 calculate 运算时对称的, calculate(x,y) 等于 calculate(y,x)
你可以试试 lru.cache 来节约运算时间。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/265564

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX