1

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

我遇到的情况是,使用我的代码的人希望使用比可用 RAM 更多的网格单元来运行它。我正在考虑修改我的代码,以便在任何给定时间仅将单元子集的信息保存在 RAM 中。不幸的是,网格(或矩阵,如果您愿意)不是稀疏的,这消除了一整类可能的解决方案。

问题:我假设在野外有一些库旨在促进这种类型的数据访问(即检索常量和变量,更新变量,存储以供将来参考,擦除内存,继续......)经过几个小时的谷歌搜索和 Stack Overflow,我发现这类库相对较少。

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

我将不胜感激有关可用库的任何建议或有关如何重新表述我的问题的建议。谢谢!

4

1 回答 1

1

咬紧牙关,自己动手?

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

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

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

于 2012-08-09T00:16:53.767 回答