私は10 977 120の乱数(60 MB)でカンマ区切りのファイルを取得しました。この作業はこれを同時に実行することであり、したがって断食的な方法で可能です。長い話を簡単に言えば、テキストファイルを文字列配列にロードします。私の次のアイデアは、この配列を4つの小さなピースに分けて、各ピースに対してそのピースを合計するスレッドを持つことでした。copyOfRangeで配列を分割するときの奇妙な実行時間
奇妙なことに、私はリストを4つに分割して、非常に異なるランニングタイムを得ています。
私はこのようになります方法持って:
public void splitNumbers(String[] numbers){
int size = numbers.length;
String[][] numberssplit = new String[4][];
numberssplit[0] = Arrays.copyOfRange(numbers, 0, size/4);
numberssplit[1] = Arrays.copyOfRange(numbers, (size/4)+1, size/2);
numberssplit[2] = Arrays.copyOfRange(numbers, (size/2)+1, 3*(size/4));
numberssplit[3] = Arrays.copyOfRange(numbers, (3*(size/4))+1, size-1);
//MS: 2750
}
以上はしかし、2つの部分のみを分割、それはだようにそれが見えるように、5つのMSを取りについて2750ミリ
numberssplit[0] = Arrays.copyOfRange(numbers, 0, size/4);
numberssplit[1] = Arrays.copyOfRange(numbers, (size/4)+1, size/2);
//numberssplit[2] = Arrays.copyOfRange(numbers, (size/2)+1, 3*(size/4));
//numberssplit[3] = Arrays.copyOfRange(numbers, (3*(size/4))+1, size-1);
MS: 5
を取りに最後の2つの部分が長くかかる。
のみ第三の部分を分割するには、2ミリ秒
//numberssplit[0] = Arrays.copyOfRange(numbers, 0, size/4);
//numberssplit[1] = Arrays.copyOfRange(numbers, (size/4)+1, size/2);
numberssplit[2] = Arrays.copyOfRange(numbers, (size/2)+1, 3*(size/4));
//numberssplit[3] = Arrays.copyOfRange(numbers, (3*(size/4))+1, size-1);
//MS: 2
を受け取り、それが唯一の作品であるスプリットだときに第四の部分はありません。最後の二つのコメントを外し最後に
//numberssplit[0] = Arrays.copyOfRange(numbers, 0, size/4);
//numberssplit[1] = Arrays.copyOfRange(numbers, (size/4)+1, size/2);
//numberssplit[2] = Arrays.copyOfRange(numbers, (size/2)+1, 3*(size/4));
numberssplit[3] = Arrays.copyOfRange(numbers, (3*(size/4))+1, size-1);
//MS: 2
は、2927ミリ秒
//numberssplit[0] = Arrays.copyOfRange(numbers, 0, size/4);
//numberssplit[1] = Arrays.copyOfRange(numbers, (size/4)+1, size/2);
numberssplit[2] = Arrays.copyOfRange(numbers, (size/2)+1, 3*(size/4));
numberssplit[3] = Arrays.copyOfRange(numbers, (3*(size/4))+1, size-1);
//MS: 2927
それはnumbersplit[2]
とnumbersplit[3]
が、それは多くの時間がかかり組み合わせたときのように思えるがかかりますが、なぜですか?明らかにJavaは、シーンの裏側でいくつかの魔法をしていますが、私はそのロジックを見ることができません。だから何が起こっている?
60MBファイルにはいくつのStringオブジェクトがありますか?基本的には、数字配列はどれくらいですか?あなたのjvmにどのくらいのメモリが割り当てられていますか? –
10 977 120 numbers ^^私は確信しています – Jazerix