50 millions ne sont pas particulièrement importants. Je voudrais juste les lire dans la mémoire. Triez-les et écrivez-les. Cela devrait prendre quelques secondes. À quelle vitesse en avez-vous besoin? Comment compilé avez-vous besoin d'être?
Sur mon ancien labtop, cela a pris 28 secondes. Si j'avais plus de processeurs, cela pourrait être un peu plus rapide mais la plupart du temps on passe à lire et écrire le fichier (15 secondes) ce qui ne serait pas plus rapide.
L'un des facteurs critiques est la taille de votre cache. La comparaison elle-même est très bon marché à condition que les données soient dans le cache. Comme le cache L3 est partagé, un thread est tout ce dont vous avez besoin pour l'utiliser pleinement.
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();
}
:) que voulez-vous dire? –
@Paul Il est juste de la matrice - regarde son surnom :) –
Pourquoi ne pouvez-vous pas utiliser des algorithmes standard? Est-ce un problème de devoirs? –