2009-06-11 14 views
4

私は16進エディタプログラムを作成していますが、ユーザーが非常に大きなファイル(3GB以上)を開こうとしたときに考えました。私は、すでにデータがロードされているときに、ファイル全体がロードされるために、ユーザが一日中座ることを望んでいません。マルチスレッドファイルへのアクセス

これは私の質問ですが、複数のスレッドが同時にファイルを読み書きすることは可能ですか?別の場所で同時にデータの特定のしきい値が1で読み込まれると、そのスレッドはデータは他の部分は読み続けるのですか?それは私にパフォーマンスの向上をもたらしますか?または、メモリ帯域幅によって、複数のスレッドを使用することで得られるスピードの向上が減るのだろうか?

答えて

4

で全体のデータを読み込む際に、データのscreenfullを読ん

をミリ秒単位で行われ、ユーザーはその行なわを実現しないであろう、読むために何neadはありませんファイル全体をメモリに保存します。ユーザーは、データを表示または変更できますが、挿入または削除はできません。

メモリマップファイルを使用するだけで済みます。データはアクセス時に自動的に読み込まれ、表示されるチャンクだけが読み込まれます。これにより、高速スクロールとファイル内の任意の場所へのジャンプが可能になります。

3

おそらく、複数のスレッドを使用したくないでしょう。マルチコアCPUの場合でも、ディスクへのパスはまだ1つしかないので、パフォーマンスの向上は得られません(ディスクアクセスは)。

小さなビットを一度に読み込んで表示するとよい考えがあります。ちょうど1つのスレッドでこれを行う。おおよそ最初のメガバイトを読んで、それを表示し、バックグラウンドで次のことをやってください。

そして、あなたはGUIのために別のスレッドが必要かもしれません。これは、BeOSが他のOSと比較して非常に敏感であった理由の1つです。これは、さまざまなタスクに多くの異なるスレッドを使用しました。

複数のスレッドがディスクから読み込んで助けてくれるとは思わないでください。

また、aio_read()を使用すると、Linuxで非同期IOを実行できます。 Windowsを使用している場合は、単に「Windows非同期io」でグーグルを試してみてください(私はあなたがどのようにそれを行うのか分かりませんが、Windowsは使用しません)。

+1

多分、I/OをGUIとは別のスレッドにするのでしょうか? GUIがまだ取得されていないデータを表示しようとすると、I/Oスレッドを中断して要求されたデータを取得する可能性があります。 – samoz

+0

@Samoz - それはまさに正しいアプローチです--IO上のUIスレッドをブロックしないでください。 – Michael

3

あなたが期待しているパーフォーマンスを確認できません。 。 。 1つのデータストリームがディスクから出てきて、複数のスレッドをディスクから読み取ると、競合が増え、競合する要求のためにディスクヘッドが前後に跳ね返るため、速度が低下する可能性があります。

代わりに非同期IOを実行し、アプリケーションが応答可能に見えるようにするためにすぐにデータを処理してください。

+0

私は帯域幅がそれを妨げると思っていましたが、私は依頼していました。 – samoz

+0

+1は非同期IOです。私はそれを考えなかったとは信じられません。それは間違いなく最も純然たる方法です... – Zifre

+0

正確には非同期I/Oとはどういう意味ですか? – samoz

0

非ブロッキングI/Oと呼ばれる非同期型を使用する方が良いと思います。つまり、読み取り要求を送信してから処理を続行し、後で要求の結果を取得することができます。したがって、単一スレッドは処理とI/Oをオーバーラップさせることができます。グーグルでは、お使いのプラットフォーム用のAPIドキュメントが見つかります。

1

ファイル全体を読むことを忘れてしまいます。ユーザーが必要とするときに小さなブロックを読み込むだけです。内容がレイアウトに影響を与えないので、16進エディタ上での操作はさらに簡単です。動き回るの代わりに、進エディタの場合は、事前

関連する問題