Медленность найдена при выборе и кодировании образа базы 64 из базы данных

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

Итак, я использую кодировку base 64 и сохраняю изображение в базе данных.

encodeURIComponent($scope.image) 

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

 decodeURIComponent($scope.image) 

с преобразованием HTML "data:image/jpeg;base64,_______" .

Прекрасно работает, но у меня так много времени, что я ожидал. Следовательно, изображение на 33% больше размера и полностью выглядит объемным.

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

Выбор текста без данных base64 значительно сокращает время. Если можно выбрать изображение отдельно в другом вызове http, после выбора другого столбца и отображения. Является ли это правильным механизмом для обработки защищенных изображений?

Solutions Collecting From Web of "Медленность найдена при выборе и кодировании образа базы 64 из базы данных"

Поскольку это всего лишь личные файлы, вы можете хранить их на S3.

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

http://php.net/manual/en/function.mime-content-type.php

просто выполните быструю проверку загруженного файла:

 $mime = mime_content_type($file_path); if($mime == 'image/jpeg') return true; 

ничего страшного!

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

По-моему, пойдите S3.

Сdk Amazon прост в использовании, и вы получаете бесплатное хранилище 1gb для тестирования. Вы также можете использовать свой собственный сервер, просто сохраните его из своей базы данных.

Решение для хранения изображений в файловой системе

Допустим, у вас 100 000 пользователей, и каждый из них имеет 10 фото. Как вы обрабатываете его локальное хранение? Проблема: файловая система Linux ломается после нескольких десятков тысяч изображений, поэтому вы должны сделать файловую структуру

Решение. Сделайте имя папки «abs (userID / 1000) * 1000» / userID

Таким образом, когда у вас есть пользователь с идентификатором 989787, его изображения будут сохранены в папке 989000/989787 / img1.jpeg 989000/989787 / img2.jpeg 989000/989787 / img3.jpeg

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

Как насчет размеров хранилища?

В прошлом месяце мне пришлось сжать 1,3 миллиона jpeg для электронной коммерции, над которой я работаю. При загрузке изображений сжимайте с помощью imagick флагов без потерь и 80% качества. Это позволит удалить невидимые пиксели и оптимизировать ваше хранилище. Поскольку наши изображения варьируются от 40×40 (эскизы) до 1500×1500 (зум-изображения), мы имеем в среднем 700×700 изображений, раз 1,3 миллиона изображений, которые заполняют 120 ГБ памяти.

Так что да, можно хранить все это на вашей файловой системе.

Когда все начинает замедляться, вы нанимаете CDN.

Как это будет работать?

CDN сидит перед вашим сервером изображений, всякий раз, когда CDN запрашивается для файла, если он не находит его в своем хранилище (промахи в кеше), он будет копировать его с вашего сервера изображений. Позже, когда запрос CDN получит запрос, он доставит изображение из собственного кеша.

Таким образом, для переноса на CDN-образ не требуется никакого кода, все, что вам нужно сделать, это изменить URL-адреса на вашем сайте и нанять CDN, то же самое работает для ведра S3.

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

Как правило, не сохраняйте файлы в базе данных.

Что должно сказать об этом руководство по MySQL? http://dev.mysql.com/doc/refman/5.7/en/miscellaneous-optimization-tips.html

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

Не сохраняйте файлы с кодировкой base4 в базе данных вообще

Прекрасно работает, но у меня так много времени, что я ожидал. Следовательно, изображение на 33% больше размера и полностью выглядит объемным.

Как вы обнаружили, нежелательные накладные расходы в кодировании / декорировании + дополнительное пространство, которое используется, что означает дополнительную передачу данных взад и вперед.

Как отметил @ mike-m. Кодировка Base64 не является методом сжатия. Зачем использовать кодировку Base64, также отвечает ссылка, которую @ mike-m отправляет Что такое кодировка base 64, используемая для ?.

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

Что относительно Gzip или других форм сжатия без участия base64. Опять же, ответ заключается в том, что ничего не выиграть и многое потерять. Например, я просто загрузил изображение JPEG 1941980 и сохранил 4000 байт, что составляет 0.2%.

Причина в том, что изображения уже находятся в сжатых форматах. Они не могут быть сжаты дальше.

Когда вы храните изображения без сжатия, их можно доставлять непосредственно в браузеры и другие клиенты, и их можно кэшировать. Если они сжаты (или закодированы в base64), их нужно разжать в приложении.

Современные браузеры могут отображать образы base64, встроенные в HTML, но тогда их нельзя кэшировать, а данные примерно на 30% больше, чем нужно.

Является ли это исключением из нормы?

Пользователь может отправлять туда данные и изображение, и все они безопасны.

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

Как насчет того, когда я вырасту до 100000 пользователей

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

Используйте CDN или используйте файловую систему, которая специально подходит для этого, как BTRFS

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

Да, в самом деле. Используйте его в полной мере, сохраняя всю информацию о файле и путь к файлу в базе данных. Затем сохраните файл в файловой системе. Вы получаете лучшее из обоих миров.

Я бы предложил вам продолжить только с base64 string, вы можете использовать метод сжатия строк LZ для уменьшения размера строки. Я использую, и он работает очень хорошо.

Я не знаю, как я приближаюсь к вашему вопросу, но надеюсь, что это поможет вам. Вот техника компрессии LZ: https://github.com/pieroxy/lz-string/