データが非常に大きい場合は、バイナリ形式をお勧めします。これにより、読み取り、特に解析が小さくなり、高速になります(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();
}
Ryan Amosが正しく指摘しているように、行列がスパースでない場合は、値を書き込むだけの方が高速である可能性があります(ただし、すべての値)。
外:
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;
}
}
(私はそれをコンパイルしていないことに注意してください-それであなたはいくつかのものを修正する必要があるかもしれません-それは私の頭のてっぺんから外れています)。
バッファがないと、バイトごとに読み取るため、速度が低下します。
もう1つのコメント-このような巨大なデータセットでは、SparseMatrixの使用を検討し、ゼロ以外の要素のみを書き込み/読み取りする必要があります(重要な要素が実際に多数ある場合を除く)。
上記のコメントに書かれているように、そのサイズのマトリックス内のすべての要素を本当に書き込み/読み取りたい場合は、すでに数秒ではなく数時間の書き込みについて話していることになります。