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

Matrix 处理存储需求超过RAM的阵列的技术,matrix,fortran,libraries,Matrix,Fortran,Libraries,我是一个在网格基础上执行计算的科学应用程序(想想有限差分网格计算)的作者。每个网格单元由一个数据对象表示,该对象保存状态变量和单元特定常量的值。到目前为止,所有网格单元对象在模拟期间始终存在于RAM中 我遇到的情况是,使用我的代码的人希望使用比可用RAM更多的网格单元来运行代码。我正在考虑修改我的代码,以便在任何给定的时间只有一部分单元的信息保存在RAM中。不幸的是,网格(或矩阵,如果您愿意)不是稀疏的,这就排除了一整类可能的解决方案 问题:我假设在谷歌搜索数小时并出现堆栈溢出后,在野外有一些库

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

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

问题:我假设在谷歌搜索数小时并出现堆栈溢出后,在野外有一些库设计用于促进这种类型的数据访问(即检索常量和变量、更新变量、存储以备将来参考、擦除内存、移动…),我发现这类图书馆相对较少

我知道一些选项,例如来自HSL数学库的这个选项:。我更喜欢使用开源的东西,并且是用Fortran或C编写的(我的代码主要是Fortran 95/2003,为了更好的衡量,我加入了一些C和Python!)


我非常感谢任何关于可用库的建议或关于如何重新表述我的问题的建议。谢谢

咬紧牙关,自己动手

我一直在处理太大的数据,比如30000多个跨越数十年的半小时数据系列。由于数据的规律性(夏令时转换是一个问题),设计一个包含随机访问光盘文件和程序ReadDay和WriteDay的方案非常简单,该程序使用序列号和日数,由于序列在不同的日期开始和停止,因此有更多的细节。因此,数组中一天的数据可能是array(Run,DayNum),但现在是ReturnCode=ReadDay(Run,DayNum,array)等等,这些代码表示该天数据的存在/不存在,等等。关键是一天的数据是一个方便的大小,一个常规(几乎)大小,尽管我的prog。为每个系列分配一条记录的缓冲区,它在大约100MB的内存中运行,而不是GB

因为数组是非稀疏的,所以它是规则的。假设网格单元的数据具有固定大小,您可以设计一个随机访问光盘文件,每个记录包含一个单元,或者,可能是一行的单元(或一列的单元)或某个值得使用的blob大小。我选择4096字节/记录,因为这是光盘文件分配大小。让计算机的操作系统和磁盘存储控制器对实际内存进行缓冲。然而,除非本地数据的计算量很大,否则典型的执行仅限于数据传输的速度。因此,在缓冲区开始满足数据请求之前,我的cpu使用率只有几个百分点


因为fortran对函数和数组使用相同的语法(不像Pascal),所以不需要声明维数组(Big,Big),而是删除它并设计函数数组(i,j),源文件中的所有读取引用都保持原样。唉,在没有“回文”函数声明的情况下,数组中的值赋值必须使用不同的语法,并且您需要设计一个子程序或类似的程序。可能可以整理草稿行数组,使用方便的语法进行处理,然后在更改后写回。

咬紧牙关,自己动手

我一直在处理太大的数据,比如30000多个跨越数十年的半小时数据系列。由于数据的规律性(夏令时转换是一个问题),设计一个包含随机访问光盘文件和程序ReadDay和WriteDay的方案非常简单,该程序使用序列号和日数,由于序列在不同的日期开始和停止,因此有更多的细节。因此,数组中一天的数据可能是array(Run,DayNum),但现在是ReturnCode=ReadDay(Run,DayNum,array)等等,这些代码表示该天数据的存在/不存在,等等。关键是一天的数据是一个方便的大小,一个常规(几乎)大小,尽管我的prog。为每个系列分配一条记录的缓冲区,它在大约100MB的内存中运行,而不是GB

因为数组是非稀疏的,所以它是规则的。假设网格单元的数据具有固定大小,您可以设计一个随机访问光盘文件,每个记录包含一个单元,或者,可能是一行的单元(或一列的单元)或某个值得使用的blob大小。我选择4096字节/记录,因为这是光盘文件分配大小。让计算机的操作系统和磁盘存储控制器对实际内存进行缓冲。然而,除非本地数据的计算量很大,否则典型的执行仅限于数据传输的速度。因此,在缓冲区开始满足数据请求之前,我的cpu使用率只有几个百分点


因为fortran对函数和数组使用相同的语法(不像Pascal),所以不需要声明维数组(Big,Big),而是删除它并设计函数数组(i,j),源文件中的所有读取引用都保持原样。唉,在没有“回文”函数声明的情况下,数组中的值赋值必须使用不同的语法,并且您需要设计一个子程序或类似的程序。可能可以对草稿行数组进行整理,使用方便的语法进行处理,然后在更改后写回。

我相信这属于大多数操作系统,通过虚拟内存自动提供RAM以外的内存。Fortran程序经常出现的问题是默认堆栈大小太小。您可以通过使用可分配变量调整操作系统设置来解决此问题