2015-07-24 3 views
1

В моем приложении java я создаю потоки, где большие файлы копируются с помощью FileOutputStream и FileInputStream, завернутых в BufferedInputStream и BufferedOutputStream. После копирования файла я пытаюсь вызвать close() для буферизованных потоков ввода/вывода, но это занимает несколько минут на Ubuntu. Когда это выполняется в OS X, потоки немедленно закрываются. Есть ли способ ускорить этот процесс?Как вы можете ускорить FileOutputStream и FileOutputStream close()?

+0

Вы пробовали «попробовать с ресурсами»? –

+0

Вы уверены, что ваш MAC-сервер имеет SSD, а ваш Ubuntu имеет жесткий диск? –

+0

Если речь идет только о копировании файлов, вы можете использовать [Files.copy (...)] (https://docs.oracle.com/javase/7/docs/api/java/nio/file/Files.html#copy % 28java.nio.file.Path,% 20java.nio.file.Path,% 20java.nio.file.CopyOption ...% 29), так как Java 7 может решить вашу проблему. Другим решением может быть использование 'FileChannel.transferTo (...)' (см., Например, [этот ответ] (http://stackoverflow.com/a/1690724/864936)). – Tom

ответ

0

В linux функция close() пытается передать данные на диск. Это намного быстрее, если у вас есть SSD (до 1000 раз быстрее), если у вас есть вращающийся диск, который вы можете записать примерно до 40 файлов в секунду (даже если он очень мал). Если у вас SSD, это будет около 20 000 за второй на ноутбуке.

+0

У вас есть источник этого? Закрытие syscall не делает этого, и я навязал программу тестирования java и не видел fsync. –

+0

@thatotherguy это не полный fsync, это обновление inode и каталога, а не самого файла. Использовали ли вы 'atop' или' iostat', чтобы увидеть скорость IOPS, которую вы выполняете? –

+1

У моего Mac на самом деле есть жесткий диск – Kalmar