0

オブジェクトの 2,000 x 2,000 2D 配列があります。

 public class Plants
{
    public string Name { get; set; }
    public int Age { get; set; }
    public int Health { get; set; }

}

ファイル全体を一気に(書き込みと読み取りのために)最速にする方法についての提案を求めていますか?つまり、このファイルをシークして特定の場所から読み書きする必要はありません。

何かご意見は?


フィードバックをお寄せいただきありがとうございます!最終的にバイナリライターを使用しました。ファイルのサイズは ~ 55MB で、保存/読み込みはかなり高速 (~ 数秒) です。

4

2 に答える 2

2

このような「最速」の質問に答えるのは本当に難しいです。問題は、ハード ドライブ、CPU、メモリ サイズ、メモリ速度、マザーボードなどのそれぞれが、私のものと異なる可能性があることです。次に、ファイルサイズとデータ形状も重要です。

圧縮されていないファイルをロードすると、非常に高速なディスクと平均的または低速な CPU を備えたシステムで大きなファイルを処理できる場合があります。ファイルの圧縮解除は、高速な CPU と平均から低速のディスク ドライブを備えたシステムでうまく機能する場合があります。ここで、メモリ使用量とアクセス速度をミックスに投入します。

これらすべての潜在的な影響に対処したら、ソフトウェア内でのデータの使用を取り巻く状況にも対処する必要があります。一度ロードして繰り返し使用できますか?そうすれば、思ったほど読み込み速度を気にする必要はありません。それとも、ごく頻繁に読み書きする必要があり、あちこちで小さな変更を加えるだけですか? 次に、代わりにランダム アクセス ストレージまたはデータベースの使用を検討する必要があります。

これらすべての懸念事項 (さらに多くの懸念事項があります) を検討したので、「そのすべての努力に見合う価値があるか?」と考えているかもしれません。あなたがそのように考えているなら、あなたは正しい場所にいます。

事前に最適化しないでください。うまく機能するものを選択し(絶対的に最適であるとは限りません)、必要に応じて後で最適化します。

于 2013-06-19T20:04:18.650 に答える
1

最速は、バイトをストリームに読み書きし、名前の長さも書き込んでデシリアライズできるようにすることです。

Protobuf-Net (インターフェイスを定義しやすいバイナリ プロトコル) または Json.Net + Zip とほぼ同じくらい高速 (かつはるかに簡単) です。Protobuf を微調整して、処理中に Plant をストリーム出力する必要がある場合に備えて、長さヘッダーを書き込むことができます。

GZipStream または DeflateStream も検討する必要があります。これは、ディスクから大量のデータに一度にアクセスする場合にメリットがある可能性があるためです。

于 2013-06-19T19:54:27.943 に答える