Эффективная массовая передача данных через ввод / вывод в Java - PullRequest
1 голос
/ 09 июля 2010

Существует ли в Java эффективный механизм для передачи больших объемов данных (~ 10 ГБ) между диском и сетью на младшей машине?Младшая машина - это машина с объемом оперативной памяти менее 10 ГБ.Я хочу эффективно передать ~ 10 ГБ порций файла с одного компьютера на другой.

Ответы [ 4 ]

1 голос
/ 10 июля 2010

Я думаю, вам нужно просто скопировать InputStream в OutputStream. Я бы начал с использования чужой реализации commons-io: IOUtils.copyLarge (InputStream, OutputStream)

InputStream is = null;
OutputStream os = null;
try{
    InputStream is = new FileInputStream("yourfile.bin");
    OutputStream os = remoteSocket.getOutputStream();
    IOUtils.copyLarge(is,os);
}finally{
    IOUtils.closeQuietly(is);
    IOUtils.closeQuietly(out);
}

Это должно быть хорошим стартером для десяти. Если вам требуется более высокая пропускная способность, вы можете начать размещать действия чтения и записи в отдельных потоках, это теоретически должно обеспечить полное насыщение самой медленной из ссылок, но может быть лучше использовать метод FileChannel # TransferTo, если использовать традиционные вещи просто недостаточно.

1 голос
/ 09 июля 2010

Наиболее эффективным средством ввода / вывода в Java являются библиотеки NIO . Если ваши данные подходят, применение фильтра потоков сжатия также поможет.

0 голосов
/ 10 июля 2010

К вашему сведению, только TransferTo () оптимизируется только между файлами, а не через файл-сокет, в Java 6

0 голосов
/ 10 июля 2010

традиционный сокет и файл io будут в порядке.

в Java 6, насколько я знаю, прямой оптимизации сокетов файлов не существует.

даже если и есть, как по слухам в Java 7, это не сильно улучшит производительность. Ваш код будет привязан к диску или сети. копия не должна иметь значения.

...