有效地收集大量数据

时间:2017-08-02 19:37:02

标签: python physics astronomy

我有一个创建太阳系的程序,集成直到相邻行星之间发生紧密相遇(或直到10e + 9年),然后将两个数据点写入文件。当行星离得太近时,尝试和除了作为旗帜。该过程重复16,000次。这一切都是通过导入模块REBOUND来完成的,模块是一个软件包,它集成了重力影响下的粒子运动。

for i in range(0,16000):
    def P_dist(p1, p2):
        x = sim.particles[p1].x - sim.particles[p2].x
        y = sim.particles[p1].y - sim.particles[p2].y
        z = sim.particles[p1].z - sim.particles[p2].z
        dist = np.sqrt(x**2 + y**2 + z**2)
        return dist

    init_periods = [sim.particles[1].P,sim.particles[2].P,sim.particles[3].P,sim.particles[4].P,sim.particles[5].P]

    try:
        sim.integrate(10e+9*2*np.pi)
    except rebound.Encounter as error:
        print(error)
        print(sim.t)

    for j in range(len(init_periods)-1):
        distance = P_dist(j, j+1)
        print(j,":",j+1, '=', distance)
        if distance <= .01: #returns the period ratio of the two planets that had the close enecounter and the inner orbital period between the two
            p_r = init_periods[j+1]/init_periods[j]
            with open('good.txt', 'a') as data: #opens a file writing the x & y values for the graph
                data.write(str(math.log10(sim.t/init_periods[j])))
                data.write('\n')
                data.write(str(p_r))
                data.write('\n')

是否有近距离接触主要取决于我指定的随机值,该随机值还控制模拟可以运行多长时间。例如,我选择随机值为最大值9.99,并且在大约11e + 8年(大约14小时)发生近距离碰撞。随机值的范围从2到10,并且在较低的一侧经常发生近距离接触。每次迭代,如果发生近距离接触,我的代码将写入我认为可能占用大量模拟时间的文件。由于我的大部分模拟时间都是通过尝试定位近距离接触而占用的,所以我想通过找到一种方法来收集所需的数据,而不必每次迭代都附加到文件中。

由于我试图绘制从此模拟中收集的数据,创建两个数组并输出数据会更快吗?或者,当所有16000次迭代完成时,有没有办法只需写一次文件

sim是一个变量,包含有关太阳系的所有信息。

这不是完整的代码,我省略了我创建太阳系的部分。

count = 0
data = open('good.txt', 'a+')
....
     if distance <= .01:
         count+=1
         while(count<=4570)
             data.write(~~~~~~~)
....
data.close()

1 个答案:

答案 0 :(得分:1)

每次发现近距离接触时,问题都不是你写的。这就是说,对于每次遭遇,您打开文件,写一个输出记录,然后关闭文件。所有打开和追加都是。请尝试这样做:打开文件一次,并且每条记录只执行一次写入。

# Near the top of the program
data = open('good.txt', 'a')
...
    if distance <= .01: #returns the period ratio of the two planets that had the close enecounter and the inner orbital period between the two
        # Write one output record
        p_r = init_periods[j+1]/init_periods[j]
        data.write(str(math.log10(sim.t/init_periods[j])) + '\n' +
                   str(p_r) + '\n')
...
data.close()

这应该可以正常工作,因为写入将被缓冲,并且通常与下一次计算并行运行。