我需要一种在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。
任何想法以更紧凑的方式格式化源代码(编译器优化友好?)或者可能将数据打包到其他结构(如字符串/原始二进制数据并在运行时提取)?
答案 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字符长的字符串,你甚至可以将它分成几个部分。在运行时只需反转一切。