在所有双打的清晰矩阵中读取的快速方法是什么(在此矩阵中没有遗漏的元素)。大多数条目都是非零双精度,可能30%为零。尺寸约为100万行和100列。
我正在使用的功能如下。然而,对于超过1千兆字节的矩阵来说,这是非常慢的。
我怎样才能更快地完成这项工作?是否有以下任何帮助: - 而不是保存为csv并读取它,尝试保存为二进制格式或其他格式。 - 将矩阵转置到数据文件中,然后逐列读取,而不是像下面的函数那样逐行读取。 - 以某种方式将矩阵序列化为Java对象以进行重新读取。
private static Vector<Vector<Double>> readTXTFile(String csvFileName, int skipRows) throws IOException {
String line = null;
BufferedReader stream = null;
Vector<Vector<Double>> csvData = new Vector<Vector<Double>>();
try {
stream = new BufferedReader(new FileReader(csvFileName));
int count = 0;
while ((line = stream.readLine()) != null) {
count += 1;
if(count <= skipRows) {
continue;
}
String[] splitted = line.split(",");
Vector<Double> dataLine = new Vector<Double>(splitted.length);
for (String data : splitted) {
dataLine.add(Double.valueOf(data));
}
csvData.add(dataLine);
}
} finally {
if (stream != null)
stream.close();
}
return csvData;
}
答案 0 :(得分:3)
我更改了你的代码以摆脱所有Vector和Double对象的创建,转而使用固定大小的矩阵(假设你知道或者可以提前计算文件中的行数和列数) )。
我向其投掷了500,000行文件,并且看到了大约25%的改进。
private static double[][] readTXTFile(String csvFileName, int skipRows) throws IOException {
BufferedReader stream = null;
int totalRows = 500000, totalColumns = 6;
double[][] matrix = new double[totalRows][totalColumns];
try {
stream = new BufferedReader(new FileReader(csvFileName));
for (int currentRow = 0; currentRow < totalRows; currentRow++) {
String line = stream.readLine();
if (currentRow <= skipRows) {
continue;
}
String[] splitted = line.split(",");
for (int currentColumn = 0; currentColumn < totalColumns; currentColumn++) {
matrix[currentRow][currentColumn] = Double.parseDouble(splitted[currentColumn]);
}
}
} finally {
if (stream != null) {
stream.close();
}
}
return matrix;
}