2

我需要一种在 DLL 中存储大量数字只读数据(双值)的方法。数据必须嵌入到源代码中,因为它会不时更改 - 没有 Visual Studio 等外部工具,只有代码生成 + shell 编译器。

我知道这是一种不好的做法,但这是“业务需求”。

我需要存储大约2 000 000 个 32 位浮点值。这应该是大约 8MB 的原始数据。假设 DLL 大小限制为 100MB。语言是Fortran

我的第一个想法是为动态数组生成值分配:

work(1,1,1,1) = 826
work(1,1,1,2) = 935
work(1,1,1,3) = 712.5
work(1,1,1,4) = 617.1
work(1,1,1,5) = 102.2

但最终的源文件大约有 70 兆字节,编译的机会为 0(编译器内存不足错误)。此外,即使它可以编译,最终的 DLL 对于每 0.5MB 有用数据的大小约为 5MB。

任何想法以更紧凑的方式格式化源代码(编译器优化友好?)或者可能将数据打包到其他结构,如字符串/原始二进制数据并在运行时提取?

4

2 回答 2

2

这正是该DATA语句的用途:

  real work(10, 10, 10, 10)
  data work/826, 935, 712.5, 617.1, 102.2/

根据您使用的编译器,您甚至可以将数据设为只读,以便程序更改任何位的任何尝试都会导致段错误异常。

一些编译器支持数据语句中的显式数组成员枚举:

  data work(1,1,1,1)/826/, work(1,1,1,2)/935/, work(1,1,1,3)/712.5/
  data work(1,1,1,4)/617.1/, work(1,1,1,5)/102.2/

这将更容易以无序的方式生成。

于 2013-01-23T21:41:38.137 回答
1

我不知道使用 Fortran 是否有更好的解决方案,但如果其他一切都失败了,您可以执行以下操作。

只需将 2,000,000 个 32 位浮点数视为 8,000,000 字节,然后 Base64 将它们编码为字符串。您最终将得到一个 12,800,000 字符长的字符串,您可以甚至可能应该将其拆分为几个部分。在运行时只需反转所有内容。

于 2013-01-23T21:48:10.173 回答