我必须对 Java 序列化提出疑问。
我只是使用 FileOutputStream 和 BufferedOutputStream 结合 Dataoutputstream 将 10 个大小为 int[] array = new int[2^28] 的数组写入我的硬盘(我知道这有点大,但我需要它) . 在每次序列化之前,我创建一个新的 FileOutputstream 和所有其他流,然后我关闭并刷新我的流。
问题:第一次序列化大约需要 2 秒,之后它会增加 tp 17 秒并保持在这个级别。这里有什么问题?如果我进入代码,我可以看到 FileOutputStreams 为 writeByte(...) 花费了大量时间。这是由于硬盘缓存(完整)吗?我怎样才能避免这种情况?我可以清除它吗?
这是我的简单代码:
public static void main(String[] args) throws IOException {
System.out.println("### Starting test");
for (int k = 0; k < 10; k++) {
System.out.println("### Run nr ... " + k);
// Creating the test array....
int[] testArray = new int[(int) Math.pow(2, 28)];
for (int i = 0; i < testArray.length; i++) {
if (i % 2 == 0) {
testArray[i] = i;
}
}
BufferedDataOutputStream dataOut = new BufferedDataOutputStream(
new FileOutputStream("e:\\test" + k + "_" + 28 + ".dat"));
// Serializing...
long start = System.nanoTime();
dataOut.write(testArray);
System.out.println((System.nanoTime() - start) / 1000000000.0
+ " s");
dataOut.flush();
dataOut.close();
}
}
其中 dataOut.write(int[], 0, end)
public void write(int[] i, int start, int len) throws IOException {
for (int ii = start; ii < start + len; ii += 1) {
if (count + 4 > buf.length) {
checkBuf(4);
}
buf[count++] = (byte) (i[ii] >>> 24);
buf[count++] = (byte) (i[ii] >>> 16);
buf[count++] = (byte) (i[ii] >>> 8);
buf[count++] = (byte) (i[ii]);
}
}
和 `protected void checkBuf(int need) throws IOException {
if (count + need > buf.length) {
out.write(buf, 0, count);
count = 0;
}
}`
BufferedDataOutputStream 扩展了 BufferedOutputStream 与 fit 框架一起提供。它只是将 BufferedOutputStream 与 DataOutputStream 结合起来,以减少编写大数组时的方法调用次数(这使其速度更快......最多 10 倍......)。
这是输出:
起始基准
开始运行 0
2.001972271
开始运行 1
1.986544604
开始运行 2
15.663881232
开始运行 3
17.652161328
开始运行 4
18.020969301
开始运行 5
11.647542466
开始运行 6
为什么时间会增加这么多?
谢谢,
埃斯