Как рассчитать оптимальный размер чанка для загрузки больших файлов

Существует ли такое понятие, как оптимальный размер фрагмента для обработки больших файлов? У меня есть служба загрузки (WCF), которая используется для загрузки файлов размером от нескольких сотен мегабайт.

Я экспериментировал с размерами блоков от 4 КБ, 8 КБ до 1 МБ. Большие размеры фрагментов хороши для производительности (более быстрая обработка), но это происходит за счет памяти.

Итак, есть ли способ определить оптимальный размер фрагмента в момент загрузки файлов. Как можно было бы проводить такие расчеты? Будет ли комбинация доступной памяти и пропускной способности клиента, ЦП и сети определять оптимальный размер?

Ваше здоровье

РЕДАКТИРОВАТЬ: Вероятно, следует упомянуть, что клиентское приложение будет в Silverlight.


person Fixer    schedule 09.09.2010    source источник


Ответы (1)


Если вас беспокоит нехватка ресурсов, то оптимум, вероятно, лучше всего определяется путем оценки параллелизма загрузки при пиковых нагрузках в сравнении с доступной памятью вашей системы. Количество одновременных загрузок, которые вы выполняете за раз, будет ключевой критической переменной в любом расчете, который вы можете сделать. Все, что вам нужно сделать, это убедиться, что у вас достаточно памяти для обработки параллелизма загрузки, а это довольно тривиально. Память дешева, и пропускная способность сети, скорее всего, закончится задолго до того, как вы дойдете до точки, в которой параллелизм превысит доступную память.

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

Попробуйте размер фрагмента, который соответствует размеру окна TCP/IP< /а>. Это примерно настолько оптимально, насколько вам действительно нужно получить во время разработки.

person Stephen M. Redd    schedule 09.09.2010
comment
ну, я больше имел в виду клиентские машины (которые мы не контролируем). Если я установлю размер блока, скажем, 1 МБ, он съест всю память на клиентской машине. Но если я установлю его на низком уровне, обработка займет много времени. - person Fixer; 09.09.2010
comment
Ой! с клиентской машиной все намного проще. Параллельности почти нет. Пока вы не храните биты в памяти после их получения, вы можете в значительной степени использовать любой размер фрагмента, какой захотите. Любой современный клиент, даже телефон, имеет достаточно ЦП и памяти для работы с несколькими файлами, пока вы передаете биты в хранилище после получения каждого фрагмента. Я сомневаюсь, что вы увидите какую-либо существенную разницу в производительности на уровне приложения, основанную только на размере фрагмента. Я бы выбрал 1024 КБ для больших файлов и остановился на этом. - person Stephen M. Redd; 09.09.2010