高效收集大量数据
Collecting large amounts of data efficiently
我有一个创建太阳系的程序,整合直到相邻行星之间发生近距离接触(或直到 10e+9 年),然后将两个数据点写入文件。当行星靠得太近时,try 和 except 充当一个标志。此过程重复 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()
问题不在于你每次发现近距离接触就写。就是说,对于每次相遇,您打开文件,写入一条输出记录,然后关闭文件。所有的打开和追加都是慢。试试这个,而不是:打开文件一次,并且每条记录只写一次。
# 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()
这应该能很好地工作,因为写入会得到缓冲,并且通常会 运行 与下一次计算并行。
我有一个创建太阳系的程序,整合直到相邻行星之间发生近距离接触(或直到 10e+9 年),然后将两个数据点写入文件。当行星靠得太近时,try 和 except 充当一个标志。此过程重复 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()
问题不在于你每次发现近距离接触就写。就是说,对于每次相遇,您打开文件,写入一条输出记录,然后关闭文件。所有的打开和追加都是慢。试试这个,而不是:打开文件一次,并且每条记录只写一次。
# 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()
这应该能很好地工作,因为写入会得到缓冲,并且通常会 运行 与下一次计算并行。