Если ваши данные действительно огромные, я бы порекомендовал некоторую двоичную форму - это сделает ее меньше и быстрее для чтения и особенно для анализа (XML или JSON во много раз медленнее, чем чтение / запись двоичных данных).Сериализация также приносит много накладных расходов, поэтому вы можете проверить DataInputStream и DataOutputStream.Если вы знаете, что будете писать только числа определенного типа, или знаете, в какой последовательности будут находиться данные - это, безусловно, самые быстрые.
Не забудьте обернуть файловые потоки буферизованными потоками - они сделаютваши операции на порядок быстрее.
Что-то вроде (примерный размер буфера 8192 - вы можете настроить его под свои нужды):
final File file = null; // get file somehow
final DataOutputStream dos = new DataOutputStream(
new BufferedOutputStream(new FileOutputStream(file), 8192));
try {
for (int x: ....) { //loop through your matrix (might be different if matrix is sparse)
for (int y: ....) {
if (matrix[x,y] != 0.0) {
dos.writeInt(x);
dos.writeInt(y);
dos.writeDouble(matrix[x,y]);
}
}
}
} finally {
dos.writeInt(-1); // mark end (might be done differently)
dos.close();
}
и ввод:
final File file = null; // get file somehow
final DataInputStream dis = new DataInputStream(
new BufferedInputStream(new FileInputStream(file), 8192));
try {
int x;
while((x = dis.readInt()) != -1) {
int y = dis.readInt();
double value = dis.readDouble();
// store x,y, value in matrix
}
} finally {
dis.close();
}
, как правильно указал Райан Амос, в случае, если матрица не разрежена, может быть быстрее просто записать значения (но все они):
Out:
dos.write(xSize);
dos.write(ySize);
for (int x=0; x<xSize; x++) {
for (int y=0; y<ySize; y++) {
value = matrix[x,y];
dos.write(value);
}
}
В:
int xSize = dis.readInt();
int ySize = dis.readInt();
for (int x=0; x<xSize; x++) {
for (int y=0; y<ySize; y++) {
double value = dis.readDouble();
matrix[x,y] = value;
}
}
(учтите, я не скомпилировал это - так что, возможно, вам придется исправить некоторые вещи - это не в моей голове).
Без буферов вы будетечитать побайтово, что сделает его медленным.
Еще один комментарий - с таким огромным набором данных, вы должны рассмотреть возможность использования SparseMatrix и писать / читать только те элементы, которые не равны нулю (если у вас действительно так многозначительного элементантс).
Как написано в комментарии выше - если вы действительно хотите записывать / читать каждый элемент в матрице такого размера, то вы уже говорите о часах записи, а не секундах.