我正在使用 python 来设置计算密集型模拟,然后在自定义构建的 C 扩展中运行它,最后在 python 中处理结果。在模拟过程中,我想在每个时间步存储一个固定长度的浮点数(C 双精度转换为 PyFloatObjects)代表我的变量,但我不知道提前多少时间步。模拟完成后,我需要以一种形式将结果传递回 python,其中为每个单独变量记录的数据可作为类似列表的对象(例如,(围绕 a)连续数组的(包装器)连续数组,分段连续具有固定步幅的矩阵中的数组或列)。
目前,我正在创建一个字典,将每个变量的名称映射到包含 PyFloatObject 对象的列表。这种格式非常适合在后期处理阶段使用,但我觉得创作阶段可能会快很多。
时间非常关键,因为模拟已经是一项计算量很大的任务。我希望 A. 购买大量内存和 B. 明智地设置您的实验的组合将使整个日志适合 RAM。但是,使用我当前的 dict-of-lists 解决方案将每个变量的日志保存在内存的连续部分中将需要大量的复制和开销。
我的问题是:什么是一种聪明的、低级的方法,可以以最小的空间/时间开销在内存中快速记录千兆字节的双精度,并且仍然可以转换为简洁的 python 数据结构?
澄清:当我说“记录”时,我的意思是存储到模拟之后。一旦完成,后处理阶段就开始了,在大多数情况下,我只会存储结果图。所以我实际上不需要将数字存储在磁盘上。
更新:最后,我稍微改变了我的方法,并将日志(作为将变量名映射到序列类型的字典)添加到函数参数中。这允许您传入对象,例如列表或 array.arrays 或任何具有 append 方法的对象。这会增加一点时间开销,因为我使用 PyObject_CallMethodObjArgs 函数来调用 Append 方法而不是 PyList_Append 或类似方法。使用数组可以减少内存负载,这似乎是我能做的最好的事情,而不是编写自己的扩展存储类型。谢谢大家!