Я беру в текстовом файле около 60000 строк координат точек (я ожидаю, что скоро увеличу масштаб) и выполняю расстояние Махаланобиса от каждой точки до любой другой точки, и выводу результат в виде текстового файла. Это означает, что мои результаты будут иметь длину почти 3 600 000 000 строк. Моя программа создает около 60 000 строк каждые 1 или 2 секунды.
Правильно ли я считаю, что мой код не может быть многопоточным? Есть ли лучший способ кодирования этого алгоритма? Как люди справляются с такими процессами?
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Coord {
public int a,b,c,d,e,f;
public static void main(String[] args) throws IOException {
PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("/Users/evanlivingston/2a.txt", true)));
Scanner sc = new Scanner(new File("/Users/evanlivingston/1.txt"));
List<Coord> coords = new ArrayList<Coord>();{
// for each line in the file
while(sc.hasNextLine()) {
String[] numstrs = sc.nextLine().split("\\s+");
Coord c = new Coord();
c.a = Integer.parseInt(numstrs[1]);
c.b = Integer.parseInt(numstrs[2]);
c.c = Integer.parseInt(numstrs[3]);
c.d = Integer.parseInt(numstrs[4]);
c.e = Integer.parseInt(numstrs[5]);
c.f = Integer.parseInt(numstrs[6]);
coords.add(c);
}
// now you have all coords in memory
int counter = 0; {
for(int i=0; i<coords.size(); i++ )
for( int j=0; j<coords.size(); j++, counter++ )
{
Coord c1 = coords.get(i);
Coord c2 = coords.get(j);
double foo = ((c1.a - c2.a) * (c1.a - c2.a)) *1 ;
double goo = ((c1.b - c2.b) * (c1.b - c2.b)) *1 ;
double hoo = ((c1.c - c2.c) * (c1.c - c2.c)) *2 ;
double joo = ((c1.d - c2.d) * (c1.d - c2.d)) *2 ;
double koo = ((c1.e - c2.e) * (c1.e - c2.e)) *4 ;
double loo = ((c1.f - c2.f) * (c1.f - c2.f)) *4 ;
double zoo = Math.sqrt(foo + goo + hoo + joo + koo + loo);
out.println(counter + "; " + i + " " + j + " " + zoo);
System.out.println(counter + "; " + i + " " + j + " " + zoo);
}
out.flush();
out.close();
}
}
}
}
Мой входной файл выглядит как
0 0 0 0 0 0 0
1 0 0 0 0 0 1
....
59318 12 2 12 2 12 2
Первый номер - заполнитель. Это список всех комбинаций с заменой, ограниченных суммами, которые вы видите в последней строке.
Теперь кажется, что расчеты займут около 16 часов, что все еще кажется слишком длинным. Не говоря уже о том, что я оцениваю окончательный вывод текста примерно в 120 ГБ.