代码之家  ›  专栏  ›  技术社区  ›  dlsj

高效收集大量数据

  •  1
  • dlsj  · 技术社区  · 7 年前

    我有一个程序,创建一个太阳系,整合到相邻行星之间发生近距离相遇(或直到10e+9年),然后将两个数据点写入一个文件。当行星离得太近时,“尝试”和“例外”会起到旗帜的作用。该过程重复16000次。这一切都是通过导入模块来完成的 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 回复  |  直到 7 年前
        1
  •  1
  •   Prune    7 年前

    缓慢的 一旦 ,并且只执行 按记录写入。

    # 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()