大規模なCSVからintsを読み込み、それらと特定の合計を行う必要があります。現在、私はアルゴリズムがありますjava read csv +サブアレイの特定の合計 - 最も効率的な方法
String csvFile = "D:/input.csv";
String line = "";
String cvsSplitBy = ";";
Vector<Int[]> converted = new Vector<Int[]>();
try (BufferedReader br = new BufferedReader(new FileReader(csvFile))) {
while ((line = br.readLine()) != null) {
String[] a = line.split(";",-1);
int[] b = new int[a.length];
for (int n = 0, n < a.length(), n++){
b[n] = Integer.parseInt(a[n]);
}
converted.add(b);
}
}
catch (IOException e) {
e.printStackTrace();
}
int x = 7;
int y = 5;
int sum = 0;
for (int m = 0; m < converted.size(); m++){
for (n = 0, n < x, n++){
sum = sum + converted.get(m)[n];
}
System.out.print(sum + " ");
for (int n = x + y, n < converted.get(m).length, n = n + y){
sum = 0;
for (int o = n -y; o < n; o++)
sum = sum + converted.get(m)[n];
}
System.out.print(sum + " ");
}
System.out.println("");
}
を私が実行しようとしました何を、すべての+ YをCSV行の最初のxメンバーの合計を取得した後、Xのメンバーの合計です。 (この場合、最初のx - 7の合計(0-6の合計)、次にx - 7の和、y - 5の列の後(5-11の合計)、(10-16の合計)... (最終的に最大(0-6の合計)、(5-11の合計)行番号を収集するので、最終的な結果は例えば5,9,13,155となるはずです。これは、5行目が0-6の最大合計、5行目の11行目の最大和を持つことを意味します)。わかりますように、これはかなり非効率的な方法です。まず、csv全体をstring [] int []に保存してVectorに保存しておけば、非常に非効率的なループが作成され、できるだけ早く実行する必要があります。私はたくさんの異なるxとyを持つ非常に大きなcsvを使用します。考えていたが、それを行う方法がわからないことは次のとおりです。
- は読み取りループ内でこれらの合計を行う
- は、xメンバーを常に逆方向にループしているわけではありません(最後の合計を保存して古いメンバーを減算し、新しいメンバーを追加するなど、サブアレイの合計を行う他の高速な方法)
- intStreamとparallelismを使用します私は最大を探しています)
- 異なる入力を使用してcsv?
- 上記のすべてですか?
これをできるだけ早く行うにはどうすればよいですか?ありがとうございました
ありがとうございます、私はそれを試して速度を比較します。ここでは2番目の合計(n-5)の発言だけで、最初の7と最後の5の合計は必要ありませんが、私は7人のメンバーの合計が5で移動する必要があります。1合計は最初の7の和です0〜6)、2番目は7の合計でなければなりませんが、配列pos 5〜11、次に10〜16 ...のように5で移動しますが、まだ7つのメンバーの合計です。過去7日間、5日ごとの合計(最初の合計は7日後に行うことができますが、その後は5回) ベクトルに関しては、arraylistはスレッドセーフではなく、並列性を追加することを望んでいたので、 – user3338991
合計はちょっと眩しいですが、それほど難しくありませんか?ディスクからの読み取りと計算は、最初の読み取りと計算よりも速くなります。特に、データが完全にメモリ内にある場合は、計算が高速です。しかし、私はいくつかの並列性を追加します。 –