Копирование данных файла по сети с использованием Java очень медленное - PullRequest
1 голос
/ 15 декабря 2011

Мой код должен прочитать часть данных из каждого загружаемого файла, обычно около 100 000 байтов.Это хорошо работает для локальных файлов, но может быть очень медленным в моей сети Wi-Fi, хотя моя сеть кажется адекватной (но не очень быстрой)

Итак, я создал этот простой тест:

public void testDataCopySpeed() throws Exception
    {
        File file = new File("Z:\\TestFile.mp3");
        System.out.println("start:"+new Date());
        FileChannel fc = new FileInputStream(file).getChannel();
        ByteBuffer bb = ByteBuffer.allocate(500000);         //1/2 MB
        fc.read(bb);
        System.out.println("end:"+new Date());
    }

Для локального файла потребуется меньше секунды, но для сетевого файла - более минуты.

Итак, я попытался проверить скорость своей сети, я не вижу, как проверить Wi-Fi, но я проверил интернетСкорость загрузки / скачивания с использованием http://myspeedtestonline.com/ при условии, что это будет медленнее, чем в моей реальной сети Wi-Fi.Это дало мне:

Скорость загрузки: 512 КБ / с Скорость загрузки: 40 КБ / с

, и я запустил тот же тест на другом компьютере, и он дал похожую скорость

Как это можно загрузить 1/2 МБ данных в одну секунду, но это может занять минуту, чтобы скопировать 1/2 МБ данных из одного файла в Java, файл размещен на NAS.?

РЕДАКТИРОВАТЬ: Итак, у меня есть несколько хороших ответов ниже, и я действительно хочу знать, каков наилучший способ получить доступ к первым 100 000 байтов из набора файлов для доступа только для чтения, который будетработать для локальных и сетевых файлов, или я должен иметь другой код в зависимости от того, нет ли он в сети.Исправление сети на самом деле не является решением, возможно, я смогу исправить свою сеть, но это программное обеспечение должно работать на любом компьютере, у многих моих клиентов может не быть оптимальных сетей, и у них не будет навыков для устранения проблем с сетью.

Ответы [ 2 ]

1 голос
/ 15 декабря 2011

Можете ли вы попробовать файл сопоставления памяти?

File file = new File("Z:/TestFile.mp3");
System.out.println("start:"+new Date());
FileChannel fc = new FileInputStream(file).getChannel();
MappedByteBuffer bb = fc.map(FileChannel.MapMode.READ_ONLY, 0, fc.size());
System.out.println("end:"+new Date());

Это может появиться только быстрее, или может помочь скрыть, сколько времени это займет.

0 голосов
/ 15 декабря 2011

Вы сравниваете яблоки с апельсинами здесь.При доступе к http://myspeedtestonline.com/, плагин флэш-памяти, вероятно, использует протокол HTTP, но, конечно, не CIFS.

Когда вы обращаетесь к файлу на NAS, он, скорее всего, использует протокол CIFS.Известно, что этот протокол имеет проблемы с производительностью, особенно когда он реализован на бытовых устройствах (дисках Buffalo и т. Д.).

Иногда размер MTU слишком велик, что приводит к фрагментации и повторному отправлению пакетов.

Так что я предполагаю, что в данном случае Java не является подходящим адресом для обвинения.В любом случае, однако, вы не можете проанализировать проблему с помощью простой Java-программы.Для этого вы должны использовать сетевой сниффер.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...