Лучший способ использовать RandomAccessFile - Java

Я создаю утилиту, которая записывает табличный бланк MSSQL в файл диска данных, используя RandomAccessFile. Это слишком медленно, потому что нам нужно всегда искать последнюю позицию и записывать содержимое потока. Пожалуйста, дайте мне знать любую другую альтернативу для ускорения записи в randomaccessfile.

У меня более 50 миллионов записей, с текущей логикой это заняло около 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();   

2 ответа

Согласно опубликованному коду, вам нужно только добавить к существующему файлу. Это делается проще и эффективнее с использованием буферизованного модуля записи в режиме добавления.

Таким образом, использование

BufferedWriter writer = Files.newBufferedWriter(file.toPath(), StandardOpenOptions.CREATE, StandardOpenOptions.APPEND);

вместо.

Обновление после комментария Питера: для выходного потока все в основном то же самое, только то, что Files не имеет удобной функции для "буферизованной" части. Therfore:

OutputStream outputStream = new BufferedOutputStream(Files.newOutputStream(file.toPath(), StandardOpenOption.CREATE, StandardOpenOption.APPEND));

В настоящее время вы записываете примерно 8 Кбайт (8196 / 1024) данных в каждой итерации, и каждая итерация выполняет операцию ввода-вывода, которая блокируется и требует времени. Попробуйте увеличить это хотя бы примерно до 1 Мб (10000000).

byte[] buffer = new byte[10000000];
Другие вопросы по тегам