【发布时间】:2019-02-11 07:00:24
【问题描述】:
我正在创建一个实用程序,它使用 RandomAccessFile 将 MSSQL 表 blob 写入数据磁盘文件。它太慢了,因为我们需要始终寻找最后一个位置并写入流内容..请让我知道任何其他替代方法来加速随机访问文件的写入。
我有超过 5000 万条记录,按照目前的逻辑大约需要 10 个小时。
我的代码块是这样的:
RandomAccessFile randomAccessFile = new RandomAccessFile(file, "rw");
InputStream inputStream = null;
while (rows.hasNext()) {
Row row = rows.next();
inputStream = (InputStream) row.getValues()[0];
offset = randomAccessFile.length();
byte[] buffer = new byte[8196];
int count;
randomAccessFile.seek(offset);
randomAccessFile.setLength(offset);
while ((count = inputStream.read(buffer)) != -1) {
randomAccessFile.write(buffer, 0, count);
}
}
randomAccessFile.close();
【问题讨论】:
-
您需要从特定位置写入文件吗?只是想了解您选择 RandomAccessFile 的原因。你也可以使用 BufferedWriter。
-
写入 50 MB 的数据需要一秒钟。您可以通过仅写入此大小的空白数据来进行测试。如果超过这个,是时候从数据库中提取数据了。
-
Btw setLength 在 Java 9 和 10 中非常慢。这在 Java 8 和 11 中很好。
标签: java performance large-data randomaccessfile