2

読み取り専用の数値データ (double 値) を DLL に大量に格納する方法が必要です。データは随時変更されるため、ソースに埋め込む必要があります。Visual Studio などの外部ツールは使用せず、コード生成とシェル コンパイラのみを使用します。

それが悪い習慣であることはわかっていますが、これは「ビジネス要件」です。

約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 メガバイトがあり、コンパイルする機会はありません (コンパイラのメモリ不足エラー)。さらに、コンパイルしたとしても、最終的な 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/

使用しているコンパイラによっては、データを読み取り専用にすることもできるため、プログラムがデータのビットを変更しようとすると、segfault 例外が発生します。

一部のコンパイラは、データ ステートメントでの明示的な配列メンバーの列挙をサポートしています。

  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 ビット float を 8,000,000 バイトとして扱い、それらを Base64 で文字列にエンコードするだけです。最終的には 12,800,000 文字の長さの文字列になり、それをいくつかの部分に分割することができます。実行時にすべてを逆にするだけです。

于 2013-01-23T21:48:10.173 に答える