我在IDL中编写了一个程序,它对数据执行一些计算并输出一组值。计算大约需要2分钟 然后我需要对这些结果进行分析,理想情况下,我希望每次执行不同的分析时都不必执行初始计算。
实现此目的的最佳方法是将计算中的输出保存到数据文件中,然后从其他程序读取吗?或者有一个不那么繁琐的方法来解决这个问题?
提前感谢您提供任何帮助
答案 0 :(得分:3)
是的,保存到文件是保存第一个程序结果以便以后在第二个程序中使用的最简单方法(假设您在两者之间退出IDL)。可能有多种方法可以保存数据,具体取决于数据的类型和偏好。
最简单的方法:
SAVE
命令创建的IDL .sav文件可以存储任何类型的数据,IDL变量,甚至是IDL会话的整个状态。不幸的是,它只适用于IDL(没有其他语言),如果你升级IDL版本,它可能需要重新生成。您使用RESTORE
读取这些文件,甚至可以记住变量的名称。
my_variable = 'Some data here.'
SAVE, my_variable, FILENAME='myfile.sav' ; save variable(s)
... IDL opened and closed here ...
RESTORE, 'myfile.sav' ; read variable(s) from file
print, my_variable
Some data here.
最便携的方式:
对于简单的表格数据,CSV具有高度可移植性和人类可读性的优点。但是,它也很慢,因为数字以ASCII格式存储。使用WRITE_CSV
撰写,READ_CSV
阅读。
大多数便携式二进制格式:
对于需要多种语言阅读的复杂数据,请考虑HDF5或NetCDF库。这两种都是二进制格式,可以存储大多数类型的IDL支持的数据。请注意,NetCDF实际上是一个易于使用的HDF5子集。
最简单的二进制格式:
表格数据的另一个选项是简单的二进制转储。使用WRITEU
写入打开以进行写入的普通文件。使用READU
从正常文件中读取以供阅读。
答案 1 :(得分:0)
假设您的数据计算只会很少变化,那么,是的,您最好的解决方案是将计算保存到输出文件,然后将它们读回您的分析程序。你没有说这是什么类型的数据,因此很难给出更具体的答案。假设您有一个二维数据数组,您可以将结果写为“平面”二进制文件:
pro perform_calculations
...
; assume mydata is a float array of dimensions [m,n]
openw, 1, 'results.dat'
writeu, 1, mydata
close, 1
end
然后,在同一个文件中,或者最好是另一个.pro文件:
pro perform_analysis
mydata = fltarr(m, n)
openr, 1, 'results.dat'
readu, 1, mydata
close, 1
...
end
希望这有帮助。
答案 2 :(得分:0)
保存是一种很好的方法,但是如果你在同一个会话中运行而你的第二个程序不会搞乱第一个程序中的数据,你只需调用一个然后将结果传递给第二个程序
pro do_calculations,result1,result2,result3
result1=1
result2=1.
result3=result1/result2
return
end
pro use_calculations,result1,result2,result3,result4
result4=result1-result2+result3
return
end
然后
IDL> do_calculations,result1,result2,result3
IDL> use_calculations,result1,result2,result3,result4
如果您修改use_calculations
,则可以再次执行以下操作:
IDL> use_calculations,result1,result2,result3,result4
因为早期的结果会留在内存中,除非use_calculations
对他们造成不好的事情。
您还可以设置第二个程序,以检查第一个程序是否具有第一个程序的有效结果,并根据需要调用它。