处理存储要求超过RAM的阵列的技术

时间:2012-05-11 19:46:56

标签: matrix fortran libraries

我是一个科学应用程序的作者,它在网格基础上执行计算(想想有限差分网格计算)。每个网格单元由一个数据对象表示,该对象保存状态变量和单元特定常量的值。到目前为止,在模拟过程中,所有网格单元对象始终存在于RAM中。

我遇到的情况是,使用我的代码的人希望使用比可用RAM更多的网格单元来运行它。我正在考虑重新编写代码,以便在任何给定时间只将一小部分单元格的信息保存在RAM中。不幸的是,网格(或者你喜欢的矩阵)稀疏,这消除了一整类可能的解决方案。

问题:我假设有野外的库设计用于促进这种类型的数据访问(即检索常量和变量,更新变量,存储以备将来参考,擦除内存,继续前进...)经过几个小时的Google和Stack Overflow搜索,我找到了相对较少的这类库。

我知道一些选项,例如HSL数学库中的这个选项:http://www.hsl.rl.ac.uk/specs/hsl_of01.pdf。我更喜欢使用开源的东西,用Fortran或C编写。(我的代码主要是Fortran 95/2003,有一点C和Python可以用来衡量!)

我很欣赏有关可用库的任何建议或有关如何重新解决问题的建议。谢谢!

1 个答案:

答案 0 :(得分:1)

咬紧牙关并自己滚动?

我一直处理过大的数据,例如30,000多个半小时数据系列,跨越数十年。由于数据的规律性(夏令时转换成问题),事实证明,设计涉及随机访问光盘文件和使用序列号和天数的ReadDay和WriteDay程序的方案非常简单,因为有更多详细信息,系列在不同日期开始和停止。因此,数组中的一天数据可能是Array(Run,DayNum),但现在是ReturnCode = ReadDay(Run,DayNum,Array)等等,代码表示当天数据的存在/不存在等等。关键是一天的数据是一个方便的大小,和一个常规(几乎)大小,虽然我的编程。为每个系列分配一个记录的缓冲区,它运行在~100MB的内存而不是GB。

因为你的数组是非稀疏的,所以它是常规的。假设网格单元的数据具有固定大小,您可以设计一个随机访问光盘文件,每个记录包含一个单元格,或者可能是一行的单元格(或列的单元格值)或一些有价值的blob大小。我选择有4,096字节/记录,因为这是光盘文件分配大小。让计算机的操作系统和光盘存储控制器对他们感觉到的真实内存做任何缓冲。然而,典型的执行仅限于数据传输的速度,除非本地数据的计算很重。因此,在缓冲区满足数据请求之前,我会使用几个百分点的cpu。

因为fortran使用与数组相同的语法(与Pascal不同),而不是声明DIMENSION ARRAY(Big,Big),而是删除它并设计FUNCTION ARRAY(i,j),以及所有读取引用。源文件保持原样。唉,在没有“回文”函数声明的情况下,必须使用不同的语法为数组赋值,并设计子程序或类似的子程序。可能会对一个暂存器数组进行整理,使用方便的语法进行处理,然后在更改时写回。