1

私のプログラムは、外部リソース(ネットワーク)によって受信された数百のファイルをディスクに書き込む必要があります。各ファイルは、現在GUIDという名前で特定のフォルダーに保存している単純なドキュメントですが、数百のファイルを作成し、書き込み、閉じるには時間がかかります。処理する。

これらの量のファイルをディスクに保存するためのより良い方法はありますか?私は解決策にたどり着きましたが、それが最善かどうかはわかりません。

最初に2つのファイルを作成します。1つは割り当てテーブルのようなもので、もう1つはドキュメントのすべてのコンテンツを格納する巨大なファイルです。しかし、このファイルから読み取ることは悪夢です。おそらく、メモリマップトファイルの手法が役立つでしょう。30GB以上で作業すると問題が発生する可能性がありますか?

編集: 1000個のテキストファイルをディスクに保存する最速の方法は何ですか?(書き込み操作は頻繁に実行されます)

4

3 に答える 3

2

最初に行うべきことは、アプリのプロファイリングです。特に、Disk Queue Length に関するカウンターを取得する必要があります。キューの長さは、使用しているディスク スピンドル数の 1.5 ~ 2 倍を超えてはなりません。

たとえば、ディスクが 1 つのシステムの場合、キューの長さは 2 を超えてはなりません。ディスクが 3 つある RAID アレイの場合は、6 を超える必要があります。

本当に書き込み制限があることを確認してください。その場合、大量の書き込みを行う際のパフォーマンスを高速化する最善の方法は、書き込みパフォーマンスが非常に高速なディスクを購入することです。ほとんどの RAID 設定では、パフォーマンスが低下することに注意してください。

書き込みパフォーマンスが重要な場合は、ストレージを複数のドライブに分散することが有効です。もちろん、その情報を読み取る必要があるアプリについては、これを考慮する必要があります。また、高速ドライブを購入する必要があります。

すべてのドライブが同じように作られているわけではなく、一部のドライブは他のドライブよりも高性能に適していることに注意してください。

于 2011-01-10T19:49:24.217 に答える
2

これは、 Subversionがリポジトリをディスクに保存する方法に似ています。リポジトリ内の各リビジョンはファイルとして保存され、リポジトリは 1000 リビジョンごとにフォルダーを使用します。ファイルが断片化されるか、互いに離れて配置される可能性が高いことを除いて、これはかなりうまく機能するようです. Subversion では、1000 個のリビジョン フォルダーを 1 つのファイルにまとめることができます (ただし、リビジョンは一度作成されると変更されないため、これはうまく機能します。

これらのドキュメントを頻繁に変更する予定がある場合は、埋め込みデータベースを使用してソリッド ファイルを管理することを検討できます ( Firebirdは、サイズ制限がない優れたデータベースです)。この方法では、ファイルの成長と編成を自分で管理する必要はありません (ソリッド ファイル内のファイルを変更し始めると複雑になる可能性があります)。これは、別のサービス/プロセスを使用してデータベースを管理し、それと通信する場合、同時アクセス (読み取り/書き込み) の問題にも役立ちます。新しいバージョンの Firebird (2.5) は、組み込みサーバーを使用している場合でも、データベースへの複数プロセス アクセスをサポートします。このようにして、データベース サーバーを実行しなくても、ファイル ストレージに複数のアクセスを行うことができます。

于 2011-01-10T14:09:01.783 に答える
0

そのためにThreadPoolを使用するのはどうですか?

つまり、受信した「ファイル」ごとに、実際にデータをディスク上のファイルに永続化する書き込み関数をスレッドプールスレッドにエンキューします。

于 2011-01-10T13:49:55.310 に答える