2012-04-10 2 views
1

Мне нужно объединить, скажем, около 100 изображений (png-файлов). Проблема заключается не в их объединении, которая выполняется достаточно быстро. Но загрузка их из хранилища занимает до 4 секунд. Это слишком много времени.C# .net, загрузка изображений

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

Изображения довольно малы: от 4KByte до 10KByte

я загружаю изображения таким образом:

Image img = Image.FromFile(file); 
+0

, насколько велики изображения? – Brian

+5

Я бы использовал профилировщик, чтобы увидеть, где он на самом деле медленный. Может быть I/O, а также некоторый другой код. (Я использую ANTS Performance Profiler для таких задач) –

+0

звучат так, будто вы ограничены вашим оборудованием, попробуйте профилировщик, который предложил Uwe, если он ничего не обнаружил, вам просто понадобится более быстрый HDD/SSD –

ответ

1

Две идеи:

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

  • Lazy загрузить их. Вам нужно все 100 изображений, загруженных все время? Возможно, вы можете просто загрузить первые, или самые важные из них, прежде всего, позволить программному обеспечению делать другие вещи, пока он заканчивает загрузку оставшихся изображений в фоновом режиме.

+1

Поскольку они кажутся файлами PNG, маловероятно, что сжатие ZIP будет полезно. Конечно, это может помочь, если все изображения были сжаты в один ZIP-файл, но я сомневаюсь, что это возможно (поскольку мантон, вероятно, не имеет никакого контроля над исходными данными). –

+0

@ LâmTranDuy PNG слегка сжат, но даже тогда содержимое скажет, что сжатие стоит. Попробуйте сжать белый прямоугольник. Я получаю ZIP, что на 20% больше размера PNG. – MPelletier

+0

Интересно, так как формат PNG должен полагаться на вариацию [алгоритма сжатия LZ77] (http://en.wikipedia.org/wiki/LZ77), который является алгоритмом, используемым в формате ZIP. Я предполагаю, что в этих двух алгоритмах имеется достаточно вариантов, чтобы получить такие разные результаты в некоторых конкретных сценариях. –

3

Создание нескольких потоков не улучшает I скорость/O в вашем случае. Речь идет о скорости чтения и записи вашего жесткого диска.

Загрузка 100 высококачественных изображений за 4 секунды кажется нормальной.

+0

Файлы действительно маленький: от 4KByte до 10KByte. – manton

+0

Маленькие файлы более фрагментированы на диске. Это может привести к неправильному времени поиска и задержке вращения. Что произойдет, если вы запустите его с помощью одного потока и нескольких потоков? Изменяется ли результат? –

+0

В некоторых случаях продолжительность увеличивается, а в других случаях время уменьшается, но не значительно. – manton

0

Как вы загружаете файлы изображений? Пожалуйста, поделитесь частью своего кода. Я предполагаю, что вы читаете не весь файл сразу, а что-то вроде байта байта до EOF ... Одним из способов оптимизации загрузки файлов является загрузка всего файла в предварительно выделенный буфер памяти.

+0

Это код: Изображение img = LoadImgFromFile (CurDirImg + imgNameAr [i]); Что такое предварительно выделенный буфер памяти и как его использовать в .net? – manton

+0

LoadImgFromFile() это не метод .NET Framework. Можете ли вы опубликовать исходный код для этой функции? Кроме того, почему вы используете его вместо стандартного метода Image.FromFile()? –

+0

@ LâmTranDuy Извините. Это код: Image img = Image.FromFile (файл); – manton

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