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

Algorithm 如何在DLL中存储大量只读数据?,algorithm,memory,dll,fortran,Algorithm,Memory,Dll,Fortran,我需要一种在DLL中存储大量数字只读数据(双值)的方法。 数据必须嵌入到源代码中,因为它会不时更改-没有Visual Studio等外部工具,只有代码生成+shell编译器 我知道这是一种不好的做法,但这是“业务要求” 我需要存储大约2000000个32位浮点值。 这应该是大约8MB的原始数据。假设DLL大小限制为100MB。 语言是Fortran 我的第一个想法是为动态数组生成值赋值: work(1,1,1,1) = 826 work(1,1,1,2) = 935 work(1,1,1,3)

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

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

我需要存储大约2000000个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兆字节,编译机会为零(编译器内存不足错误)。此外,即使要编译,最终DLL的大小为每0.5MB有用数据约5MB


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

这正是
data
语句的用途:

  real work(10, 10, 10, 10)
  data work/826, 935, 712.5, 617.1, 102.2/
根据您使用的编译器的不同,您甚至可以将数据设置为只读,以便程序更改其中任何位的任何尝试都会导致segfault异常

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

  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/

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

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


只需将2000000个32位浮点值视为8000000字节,并将它们编码为一个字符串。您将得到一个12800000个字符长的字符串,您可以甚至应该将它分成几个部分。在运行时,只需反转所有内容。

我的
数据属性与“work”中的可分配属性冲突。
数据
不能使用动态数组吗?我认为这个数组太大,无法创建为static@killer_PL:我怀疑这是否适用于动态数组。无论如何,如果您希望数据是静态的和只读的,不要使用动态的。使用20世纪60年代风格的静态数组。我用它来分配巨大的数组:256K,即使是一个蹩脚的编译器。错误
致命错误:错误计数达到25的极限。
数据语句或行长度有问题吗?我能强迫编译器解析比默认限制更长的行吗?@killer\u PL:如果我理解了消息,这意味着有25个错误。忽略这一点,只关注第一个错误。是的,对那个将要维护你的程序的家伙有点同情。base-64不会让你受欢迎。如果您可以将最有可能更改的编号保存在同一个包含文件中,您将简化更新过程-更改编号,只重新编译更改的文件,然后重新链接。好主意。我考虑一些比base64更大的“空间值”,也许我可以将几乎原始的二进制数据放入一个字符串中?Base85每个字符产生6.4位,20%的开销。我对Fortran一无所知,也不知道它如何在源代码中存储字符串或表示不可打印的字符,但如果字符串是零分隔的,则应该能够使用256个字符中的255个,如果字符串是长度前缀,则应该能够使用所有256个字符。所有这些都假定为8位字符,并且您能够以不太大的开销转义不可打印的字符。