3

私は大きな多次元バイト配列([8,8192,8192]の次元の配列など、配列あたり最大500mb)を使用しており、それらをファイルに読み書きして保存したいと考えています。

BinaryFormatterを使用してみましたが、非常に低速です(実行に数分かかります)。

BinaryWriterを使用してみましたが、1次元配列しか取り込めません。さて、Cでは多次元配列を一次元として渡すことに問題はありませんでした。C#では、私が見たところ、2つのオプションがあります。

  • 一次元配列にメモリの別のチャンクを割り当て、forループを使用してデータをコピーし、BinaryWriterを使用してこの配列をファイルに書き込みます
  • forループを使用して、BinaryWriterを使用して個々のバイトをファイルに書き込みます

明らかに、どこでもbyte []を使用し、myarray[i、j]を使用する代わりにmyarray [i + j * myarray_width]を使用すると、はるかに高速になりますが、作業を簡単にするためにクラス全体を書き直す必要があります。 1セットのI/O機能(保存/ロード)。

より良い方法が必要です。

4

1 に答える 1

0

高速シリアル化に関しては、安全でないコードが役立つ場合があります。ここで役立つ2つのテクニックがあります。

  1. あなたからあなたが渡すことができるbyte[,]新鮮なものへのmemcpyをしてください。もちろん、これには一時的なストレージスペースの倍増とコピーが必要です。ただし、この作業を64KBのチャンクに分割することもできます。byte[]FileStream.Write
  2. アンマネージドにPInvokeしWriteFile、値を渡しFileStream.SafeHandleます。WriteFile任意のポインタを取るので、直接書き出すことができますbyte[,](に変換されますvoid*)。

オプション2は最大限に高速です(「ゼロコピー」)。

補足:安全でないコードは、バイトを再解釈する必要がある場合に役立ちます。この機能は、Cでいくつかの優れた抽象化につながります。幸い、C#にもその機能があります。

于 2012-12-13T09:20:45.223 に答える