2013-03-06 3 views
0

У меня есть функция, которая загружает тысячи изображений за раз от стороннего источника. Количество изображений может варьироваться от 2500 до 250 000 за каждый ход. Как вы можете себе представить, этот процесс занимает некоторое время, и я хочу оптимизировать все, что могу.Производительность при загрузке тысяч изображений

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

Мой вопрос: если кто-нибудь знает, замедляет ли проверка перед загрузкой процесс (или, возможно, ускоряет его)? Было бы более эффективно загружать файл и позволять ему переопределять уже существующие изображения, тем самым вырезая шаг проверки на существование?

Если у кого-либо еще есть советы по загрузке этого объема изображений, они приветствуются!

+0

Если вы выполняете эти операции последовательно, то да, проверка замедлит работу. Но, вероятно, не очень. –

+0

Это похоже на то, что вы могли бы проверить, выполнив один раз один раз с помощью проверки и один раз без него. Однако я бы спросил, что доступ к локальной файловой системе быстрее, чем доступ к сети. Таким образом, пропуская файлы будут компенсировать любую потерю при проверке файлов. – David

+0

Определенно реализовать эту функцию асинхронно. Вы также можете отказаться от выполнения параллельных задач. –

ответ

3

Реальный ответ зависит от трех факторов:
1: как часто вы сталкиваетесь с уже существующим изображением. Чем реже вы попали, тем менее полезной проверкой является. 2: Задержка места назначения. Является ли место назначения назначения локальным или далеко? если он находится в Индии с задержкой в ​​300 мс (и вероятной высокой потерей пакетов), проверка становится более дорогой относительно загрузки. Это значительно облегчается благодаря интеллектуальному потоку. 3: Ваша пропускная способность/пропускная способность от вашего источника до пункта назначения. Чем выше ваша пропускная способность, тем меньше выгружаете файл дважды.

Если у вас есть вероятность попадания менее 1% для уже существующих изображений, вы не получаете большую прибыль от проверки (max ~ 1%), но если 90% изображений уже существуют, вероятно, стоит проверить, даже если хранилище файлов назначения удалено/удалено. В любом случае это балансирующий акт, но если у вас есть достаточно высокий уровень попадания, чтобы спросить, скорее всего, будет полезно проверить, есть ли у вас файл.

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

Если это невозможно, поскольку изображения удаляются/переименовываются или что-то в этом роде, минимизируйте влияние проверки путем ее пронизывания. Разница в производительности между foreach и Parallel.ForEach для операций с высокой задержкой огромна.

И, наконец, 250 000 изображений может быть большим количеством данных, если они являются большими изображениями. Возможно, быстрее отправить физические носители (т. Е. Поместить данные на жесткий диск и отправить диск).

+0

Спасибо за тщательный ответ. Я думаю, что буду держать чек на основании вашего ответа и других. – Ricketts

1

Выполнение

System.IO.File.Exists(pathName); 

намного дешевле, чем делать загрузку. Таким образом, это ускорит процесс, избегая времени для загрузки.

Смежные вопросы