如何在DLL中存储大量只读数据?

时间:2013-01-23 21:36:21

标签: algorithm memory dll fortran

我需要一种在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。

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

2 个答案:

答案 0 :(得分: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/

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

答案 1 :(得分:1)

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

将2,000,000个32位浮点数视为8,000,000个字节,Base64将它们编码为字符串。你将得到一个12,800,000字符长的字符串,你甚至可以将它分成几个部分。在运行时只需反转一切。