2016-11-07 4 views
0

マルチセグメント化ダウンロードのためにIDM のような動的セグメント化アルゴリズムを使用してダウンロードマネージャを開発します。スレッドはファイルの異なる領域に4GBの距離を持つ可能性があります。 の方が書き込み性能が非常に低下するためです。 私はこのデータを書き込む絶食する方法がわからない 私が代わりにStream.Writeの勝利のAPIのWriteFileを試してみましたが、私は、問題は非常にHDDヘッドの動き であることがわかった私は、各セグメントのためにメモリに5メガバイトViewStreamとメモリマップトファイルを試してみましたが、スピードを書きます私が期待したように増加しましたが、 MemoryMappedFileを使用するpsudoのコードはこれのようです。多分メモリマップトファイルを使用しての私のアプローチは、私があなたの代わりにWinAPIの標準ストリーム implemenetationを使用することをお勧め高速書き込み巨大ファイルマルチセグメント化C#

create MemoryMappedFile 
for each segment 
create 5MB ViewStream 
write to memory stream 
if data passed 5 MB or passed end of segment then close ViewStream and Create new ViewStream if not passed end of segment 
+0

どのような利点がありますか?私のファイルが5GBだと思う私は50 * 100MBを作成するすべてのファイルに書き込むために5GBのスペースを越えて移動する必要があります私の問題はこのエリアの秒あたりシークの数ですver – Hamid

+0

あなたのネットワークはあなたのディスクより速いですか?一致するには良いSSDのRAIDを取得します。 –

+0

いいえ10MBのネットワーク速度ではなく、約80MBのHDD書き込み速度 – Hamid

答えて

1

間違っています。単一のファイルで書くのではなく、別のファイルに書き込んでから、それらを一緒にマージしてください。このようにして、HDDはファイル内の具体的な位置への 'シーク'操作なしで書き込みを行うことができます(これがおそらく書き込みが遅い理由です)。 5ギガバイトを横切って移動に関するご質問については

- それは、このような問題を解決するためのバッファを所有しており、それはかなりよく、それを解決し、最初の場所でHDDの問題です。

多くの小さなファイルを書き込む場合、HDDは効率を上げるためにバッファ内のコンテンツをどのように再配置できるかを検討します。たとえば、バッファにデータのチャンクを格納することができます。データが書き込まれるまでになったら、1回(1つのサークル)に書き込みます。ご覧のように、バッファ内の完全に異なる位置に書き込むので、マルチスレッドの文章にも役立ちます。

+0

これは理由ですが、複数のファイルがどのように問題を解決するか説明できますか? IDMは私のHDDに非常に高い書き込み速度で大きなファイルをダウンロードします – Hamid

+0

私は私の答えを更新しました。 – eocron

+0

tnx私はそれをチェックし、小さなファイルのどのサイズの方がパフォーマンスが良いかをお知らせします。 – Hamid

関連する問題