7

私は8つのファイルを持っています。それぞれ約 1.7 GB です。これらのファイルをバイト配列に読み込んでいますが、その操作は十分に高速です。

各ファイルは次のように読み取られます。

BufferedReader br=new BufferedReader(new InputStreamReader(new ByteArrayInputStream(data))); 

シーケンシャルな意味で単一のコアを使用して処理すると、完了するまでに約 60 秒かかります。ただし、計算を 8 つの個別のコアに分散すると、ファイルごとに 60 秒よりもはるかに長い時間がかかります。

データはすべてメモリ内にあり、IO 操作は実行されないため、コアごとに 1 つのファイルを処理するのに 60 秒もかからないと推測できます。したがって、合計 8 つのファイルは 60 秒強で完了するはずですが、そうではありません。

BufferedReader の動作について何か不足していますか? または上記のコードで使用されているリーダーのいずれか。

最初にファイルをアップロードするためにこのコードを使用していることに言及する価値があるかもしれません:

byte[] content=org.apache.commons.io.FileUtils.readFileToByteArray(new File(filePath));

全体のコードは次のようになります。

For each file
 read the file into a byte[]
 add the byte[] to a list
end For
For each item in the list
 create a thread and pass a byte[] to it
end For
4

2 に答える 2

3

実際にどのように「計算を分散」していますか? 同期は関係していますか? 8 つのファイルを読み取るために 8 つのスレッドを作成するだけですか?

どのプラットフォーム (Linux、Windows など) で実行していますか? コア間で負荷のバランスを取るために、単一のプロセスをコアからコアに移動する前に、Windows スケジューラの奇妙な動作を見たことがあります。これにより、単一のコアを残りのコアよりも多く使用できるようにするよりも、パフォーマンスが低下しました。

于 2013-02-27T13:49:41.497 に答える
2

システムのメモリ容量はどれくらいですか?

8 x 1.7GB、+ オペレーティング システムのオーバーヘッドは、仮想メモリ/ページングが機能しなければならないことを意味する場合があります。これは明らかにRAMよりもはるかに遅いです。

各ファイルがメモリ内にあるとおっしゃっていただきありがとうございますが、実際には 16GB の空き RAM がありますか、それとも抽象化されたレベルでさらに多くのことが行われていますか?

コンテキスト スイッチも常にページを切り替える必要がある場合は、時間の増加を説明できます。

于 2013-02-27T13:52:51.223 に答える