我正在尝试创建一个文本文件,其中包含10亿个随机排序的非重复数字。我创建了以下代码,但是在完成(堆满)之前很久内存不足。我正在寻找有关如何创建此txt文件的建议或代码更正。
private int maxSize = 1000000000;
private int minimum = 1;
try {
ArrayList<Integer> arrayList = new ArrayList<Integer>();
for(int i = minimum - 1; i < maxSize; i++){
arrayList.add( i);
}
numlist.close();
// shuffle 10 times for true mix up
for(int j = 0; j < 10; j++){
Collections.shuffle(arrayList);
}
BufferedWriter numlist = new BufferedWriter(new FileWriter("randomNumbersNoRepeats.txt"));
for(int i = minimum - 1; i < maxSize; i++){
System.out.println(i);
numlist.write(i + ",");
}
numlist.close();
} catch (Exception e) {
System.out.println("Error in creating writer new bufferWriter"
+ " for randomNumbersNoRepeats.txt");
}
最佳答案
宣布:
private static final int maxSize = 1_000_000_000;
static int[] array = new int[maxSize];
用非重复数字填充数组,例如
array[i] = i + 1;
。编写使用Fisher–Yates shuffle algorithm的改组方法。这不需要很多代码行,所以我认为我不需要为您做。
使用类似
-Xmx10G
VM参数的程序运行程序。这将确保为阵列分配足够的堆空间。感谢安迪·特纳(Andy Turner)的启发。编辑:安迪(Andy)继续激发灵感:要一次性初始化和改组数组,可以使用同一Wikipedia文章中所述的inside-out algorithm。在Java中:
Random r = new Random();
for (int i = 0; i < maxSize; i++) {
int j = r.nextInt(i + 1);
if (j != i) {
array[i] = array[j];
}
array[j] = i + 1;
}