Хранение множества маленьких файлов: архив против файловой системы - PullRequest
1 голос
/ 01 июня 2011

Я создаю приложение, для которого требуется много миниатюр изображений (~ 3000, 5-25 КБ).Поскольку скорость очень важна, я планирую загрузить эти изображения в память при запуске приложения.Во время выполнения новые эскизы будут загружаться и добавляться в коллектив.

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

Мой второй вариант - сохранить их в каком-то (сжатом) архиве.Это сделало бы само хранилище и загрузку более эффективным (я думаю).Однако новые файлы будут добавляться регулярно, и это, вероятно, будет не так гладко, как простое сохранение их в папке.

Является ли хранение кеша небольших файлов в (сжатом) архиве плохой идеей или нет?ZIP-файлы - это путь?Будет ли лучше использовать несжатые архивы (и если да, то какого рода)?

Все файлы изображений будут в формате JPEG.

Заранее спасибо!

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

Ответы [ 6 ]

1 голос
/ 01 июня 2011

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

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

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

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

В конце могут быть добавлены новые изображения, и индекс соответствующим образом обновлен.

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

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

1 голос
/ 01 июня 2011

Все дисковое хранилище и большая часть базы данных выделяют пространство порциями. Части на дисках большой емкости могут быть большими. Если у вас есть файлы размером 5 КБ и диск размером 32 КБ, у вас остается 85% неиспользуемого пространства в вашем хранилище.

Использование архива не будет сильно сжимать jpeg, потому что алгоритм кодирования jpeg уже делает это. Тем не менее, это сэкономит вам впустую пространство на носителе. Это усложняет и, возможно, немного медленнее.

0 голосов
/ 02 июня 2011

Я знаю, что на этот вопрос уже дан ответ, но я думаю, что вам нужно больше возможностей, кроме zip.

Хотя zip - это хорошо, на JPEG это не сильно влияет, поскольку JPEG уже сжал.

Другая вещь, которую вы можете рассмотреть, это:

  1. Поместите изображение в Сеть доставки контента (CDN)
  2. Сжатие компонентов с помощью gzip (это означает, что сервер будет автоматически архивировать каждый ответ), и вам не нужно писать какой-либо код, чтобы распаковать его позже - он обрабатывается браузером автоматически.
  3. Поскольку вы упоминаете JPEG, вы можете использовать JPEGTran .Run jpegtran на всех ваших JPEG.

    Этот инструмент выполняет операции JPEG без потерь, такие как вращение, а также может использоваться для оптимизации и удаления комментариев и другой бесполезной информации (например, информации EXIF) из ваших изображений. jpegtran -copy none -optimize -perfect src.jpg dest.jpg

  4. Использовать Спрайты изображений . Вместо того, чтобы просить браузер загрузить много изображений одновременно, попросите браузер загрузить только одно.

Подробнее см .: http://developer.yahoo.com/performance/rules.html#opt_images

Для базового ознакомления с тем, как повысить производительность вашего сайта, вы можете попробовать установить YSlow (плагин для обнаружения неэффективного кода) в Firefox.

Надеюсь, это поможет.

0 голосов
/ 01 июня 2011

Если это веб-приложение, то лучший прирост производительности, который вы можете получить, это установить хорошие заголовки HTTP-кэширования.Наличие уникального URL-адреса для каждого изображения (а также разных URL-адресов для разных версий одного и того же изображения) позволяет установить ОЧЕНЬ отдаленные заголовки с истекшим сроком в будущем, поскольку при изменении изображения URL-адрес приводит к повторному поиску.t сжатие, потому что JPEG не может быть хорошо сжат, и это стоит только процессорного времени.

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

0 голосов
/ 01 июня 2011

Что ж, если у вас есть маленькие "геометрические" картинки, вы можете реализовать их как объекты типа javax.swing.Icon, а не как изображения, загружаемые из файловой системы. http://download.oracle.com/javase/6/docs/api/javax/swing/Icon.html

http://download.oracle.com/javase/tutorial/uiswing/components/icon.html

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

0 голосов
/ 01 июня 2011

По-моему, я думаю, что zip-файл - плохая идея, потому что вы замедляете все вместе с процессом загрузки zip-файла и распаковываете его для извлечения каждого изображения.

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

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