I have the following 10000000x2 matrix:
0 0 1 1 2 2 .. .. 10000000 10000000 Now I want to save this matrix to int[][] array:
import com.google.common.base.Stopwatch; static void memory(int size) throws Exception { System.out.println("Memory"); Stopwatch s = Stopwatch.createStarted(); int[][] l = new int[size][2]; for (int i = 0; i < size; i++) { l[i][0] = i; l[i][1] = i; } System.out.println("Keeping " + size + " rows in-memory: " + s.stop()); } public static void main(String[] args) throws Exception { int size = 10000000; memory(size); memory(size); memory(size); memory(size); memory(size); } The output:
Keeping 10000000 rows in-memory: 2,945 s Keeping 10000000 rows in-memory: 408,1 ms Keeping 10000000 rows in-memory: 761,5 ms Keeping 10000000 rows in-memory: 543,7 ms Keeping 10000000 rows in-memory: 408,2 ms Now I want to save this matrix to disk:
import com.google.common.base.Stopwatch; import java.io.BufferedOutputStream; import java.io.FileOutputStream; static void file(int size, int fileIndex) throws Exception { Stopwatch s = Stopwatch.createStarted(); FileOutputStream outputStream = new FileOutputStream("D:\\file" + fileIndex); BufferedOutputStream buf = new BufferedOutputStream(outputStream); for (int i = 0; i < size; i++) { buf.write(bytes(i)); buf.write(bytes(i)); } buf.close(); outputStream.close(); System.out.println("Writing " + size + " rows: " + s.stop()); } public static void main(String[] args) throws Exception { int size = 10000000; file(size, 1); file(size, 2); file(size, 3); file(size, 4); file(size, 5); } The output:
Writing 10000000 rows: 715,8 ms Writing 10000000 rows: 636,6 ms Writing 10000000 rows: 614,6 ms Writing 10000000 rows: 598,0 ms Writing 10000000 rows: 611,9 ms Shouldn't be saving to memory much faster?
OutputStreamis buffered, so it's only writing to memory until the buffer is full before writing it to disk...You could try flushing the buffer on each iteration or get rid of it altogether...BufferedOutputStreamand the OS buffer cache will mask the latency of the physical disk write. I'll just add that callingbuf.flush()and thenoutputStream.getChannel().force(true)after the writes would force the write to go all the way to physical disk. Most applications wouldn't do this, but it's useful if you have a requirement for a durable write.