Мой опыт работы с файлами большего размера показал, что java.nio
быстрее, чем java.io
. Значительно быстрее. Как в диапазоне> 250%. Тем не менее, я устраняю очевидные узкие места, которые, как я полагаю, могут повлиять на ваш микропроцессор. Потенциальные области для расследования:
Размер буфера. Алгоритм, который вы в основном используете,
- копирование с диска в буфер
- копирование из буфера на диск
Мой собственный опыт показывает, что этот размер буфера созрел для настройки. Я остановился на 4 КБ для одной части моего приложения, 256 КБ для другой. Я подозреваю, что ваш код страдает от такого большого буфера. Запустите несколько тестов с буферами 1 КБ, 2 КБ, 4 КБ, 8 КБ, 16 КБ, 32 КБ и 64 КБ, чтобы доказать это самим.
Не выполнять тесты Java, которые читают и записывают на один и тот же диск.
Если вы это сделаете, то вы действительно тестируете диск, а не Java. Я также хотел бы предложить, что если ваш процессор не занят, то вы, вероятно, испытываете некоторые другие узкие места.
Не используйте буфер, если вам это не нужно.
Зачем копировать в память, если вашей целью является другой диск или сетевая карта? При использовании больших файлов задержка становится нетривиальной.
Как и другие говорили, используйте FileChannel.transferTo()
или FileChannel.transferFrom()
. Ключевым преимуществом здесь является то, что JVM использует доступ ОС к DMA ( Прямой доступ к памяти ), если имеется. (Это зависит от реализации, но современные версии Sun и IBM для процессоров общего назначения хороши.) Что происходит, если данные направляются прямо на диск / с диска, на шину и затем к месту назначения. ... в обход любой цепи через ОЗУ или ЦП.
Веб-приложение, над которым я работал день и ночь, очень тяжелое. Я также сделал микро тесты и реальные тесты. И результаты на моем блоге, посмотрите:
Использование производственных данных и сред
Микро-тесты подвержены искажениям. Если вы можете, постарайтесь собрать данные именно из того, что вы планируете делать, с ожидаемой нагрузкой на ожидаемое оборудование.
Мои тесты являются надежными и надежными, потому что они проводились в производственной системе, сложной системе, загруженной системе, собранной в журналах. Не 2,5-дюймовый SATA-диск моего ноутбука со скоростью вращения 7200 об / мин, в то время как я интенсивно наблюдал, как JVM работает на моем жестком диске.
На чем ты бежишь? Это имеет значение.