50 миллионов не особо велики.Я бы просто прочитал их в память.Сортируйте их и запишите.Это займет всего несколько секунд.Как быстро тебе это нужно?Насколько он вам нужен?
На моем старом labtop это заняло 28 секунд.Если бы у меня было больше процессоров, это могло бы быть немного быстрее, но большая часть времени была бы потрачена на чтение и запись файла (15 секунд), который не был бы быстрее.вашего кеша.Само сравнение очень дешево, если данные находятся в кеше.Поскольку кэш L3 является общим, все, что вам нужно для его полного использования, - это один поток.
public static void main(String...args) throws IOException {
generateFile();
long start = System.currentTimeMillis();
int[] nums = readFile("numbers.bin");
Arrays.sort(nums);
writeFile("numbers2.bin", nums);
long time = System.currentTimeMillis() - start;
System.out.println("Took "+time+" secs to sort "+nums.length+" numbers.");
}
private static void generateFile() throws IOException {
Random rand = new Random();
int[] ints = new int[50*1000*1000];
for(int i= 0;i<ints.length;i++)
ints[i] = rand.nextInt();
writeFile("numbers.bin", ints);
}
private static int[] readFile(String filename) throws IOException {
DataInputStream dis = new DataInputStream(new BufferedInputStream(new FileInputStream(filename), 64*1024));
int len = dis.readInt();
int[] ints = new int[len];
for(int i=0;i<len;i++)
ints[i] = dis.readInt();
return ints;
}
private static void writeFile(String name, int[] numbers) throws IOException {
DataOutputStream dos = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(name), 64*1024));
dos.writeInt(numbers.length);
for (int number : numbers)
dos.writeInt(number);
dos.close();
}