Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
|
|||
|---|---|---|---|
|
#18+
На стороне клиента при выборе фото (поле input / file) отображаются уменьшенные превью этих фото. Считываются файлы методом API.createObjectURL() , который создаёт в оперативной памяти объектный URL и возвращает строку вида: blob: http://www.site.ru/17b3ab49-dbc2-48e5-afc2-be1d64cec7ef Эту строку далее присваиваем атрибуту image.src и дело в шляпе. Задача заключается в том, чтобы из созданного в оперативной памяти объектного URL , имеющего ссылку blob: http://www.site.ru/17b3ab49-dbc2-48e5-afc2-be1d64cec7ef , получить BLOB либо ArrayBuffer . Как это сделать ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2017, 22:55 |
|
||
|
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
|
|||
|---|---|---|---|
|
#18+
Повторно считывать файл нельзя - в целях экономии процессорного времени и оперативной памяти ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2017, 23:00 |
|
||
|
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
|
|||
|---|---|---|---|
|
#18+
Cyrax_02, Может это пригодится 19155677 Пример Код: html 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2017, 23:12 |
|
||
|
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
|
|||
|---|---|---|---|
|
#18+
Да, для получения строки для image.src можно использовать метод fileReader.readAsDataURL() , возвращающий строку данных в формате base64 : data:image/jpeg;base64,/9j/4TP+RXhpZg... Но в отличие от API.createObjectURL() / API.revokeObjectURL() , в этом случае нельзя явно освободить память, отведённую под эту длинную строку. Даже если выполнить присваивание image.src = "" или image.src = 'about:blank' . В итоге память после генерации каждого превью не освобождается и в процессе генерации превью для N-го количества фотографий памяти не хватит (браузеры в этом плане оооочень прожорливы). Safari может слететь, в других браузерах получим ошибки. Т.е. нужно использовать именно API.createObjectURL() / API.revokeObjectURL() . А этот метод возвращает объектный URL вида: blob: http://www.site.ru/17b3ab49-dbc2-48e5-afc2-be1d64cec7ef P.S. Сабжевый вопрос остаётся в силе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2017, 23:38 |
|
||
|
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2017, 23:59 |
|
||
|
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
|
|||
|---|---|---|---|
|
#18+
авторХм... А может FileReader -> Blob -> createObjectURL?В этом случае метод URL.createObjectURL() создаст в оперативной памяти независимую копию переданного ему BLOB-объекта и вернёт blob -ссылку на эту копию. Соответственно, метод URL.revokeObjectURL() удалит из памяти эту копию, а не исходный BLOB-объект, полученный через FileReader. Ну а исходный BLOB-объект по-прежнему будет занимать в памяти место, как и в случае чтения файла методом fileReader.readAsDataURL() P.S. Во втором вашем примере я не понял, зачем вы методу URL.createObjectURL() передаёте BLOB-объект, созданный из данных, полученных методом fileReader.readAsArrayBuffer(file) . Ведь можно сразу передать URL.createObjectURL(file) ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2017, 00:24 |
|
||
|
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
|
|||
|---|---|---|---|
|
#18+
Cyrax_02, вот Вы зануда :) Ну прибейте изначальный BLOB, сразу передавайте file... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2017, 00:28 |
|
||
|
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
|
|||
|---|---|---|---|
|
#18+
Также: If a URL is only expected to be used once (for example, only shown in one Image tag), then the lOptions argument can be set to oneTimeOnly = true to revoke the URL automatically once used. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2017, 00:32 |
|
||
|
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
|
|||
|---|---|---|---|
|
#18+
авторТакже: If a URL is only expected to be used once (for example, only shown in one Image tag), then the lOptions argument can be set to oneTimeOnly = true to revoke the URL automatically once used. Эта опция работает только в IE10+ ? https://msdn.microsoft.com/en-us/library/hh772302(v=vs.85).aspx https://msdn.microsoft.com/en-us/library/hh972898(v=vs.85).aspx Спецификация вроде как вообще не предусматривает никаких опций в URL.createObjectURL() : https://developer.mozilla.org/ru/docs/Web/API/URL/createObjectURL В любом случае эта опция выступает в качестве альтернативы явному удалению объекта методом URL.revokeObjectURL() А если эту опцию понимает только IE10+, то толку от неё ? Всё равно придётся явно вызывать URL.revokeObjectURL() ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2017, 21:03 |
|
||
|
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
|
|||
|---|---|---|---|
|
#18+
авторВ этом случае метод URL.createObjectURL() создаст в оперативной памяти независимую копию переданного ему BLOB-объекта и вернёт blob-ссылку на эту копию. Соответственно, метод URL.revokeObjectURL() удалит из памяти эту копию, а не исходный BLOB-объект, полученный через FileReader. Ну а исходный BLOB-объект по-прежнему будет занимать в памяти место, как и в случае чтения файла методом fileReader.readAsDataURL()авторНу прибейте изначальный BLOBКак прибить ? Методом Blob.close() ? Если верить https://developer.mozilla.org/ru/docs/Web/API/Blob, это экспериментальный метод. Последний FF такого метода вообще не знает... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2017, 21:09 |
|
||
|
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
|
|||
|---|---|---|---|
|
#18+
Cyrax_02, а какие проблемы? для проверки я загружал картинок по 2-4м суммарным рамером до 200м выводил их как превьюшки (просто указав размер у тега img). никаких проблем ни с памятью, ни с быстродеймтвием. потом отправлял их на сервер.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2017, 22:27 |
|
||
|
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
|
|||
|---|---|---|---|
|
#18+
Cyrax_02, есть нтмл, на которой зашружаются картинки, кадрируются, изменяется размер, поворот обрезаются под <просмотровый> размер и под превьюшки. делается как для одной фотки, так и для мультизагрузки фоток ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2017, 22:35 |
|
||
|
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
|
|||
|---|---|---|---|
|
#18+
автора какие проблемы? для проверки я загружал картинок по 2-4м суммарным рамером до 200м выводил их как превьюшки (просто указав размер у тега img). никаких проблем ни с памятью, ни с быстродеймтвием. потом отправлял их на сервер.... "src" для картинок вы как генерируете ? Через URL.createObjectURL() или через FileReader ? Если используете URL.createObjectURL()/URL.revokeObjectURL() , то проблем с памятью быть и не должно. Что <image> => <canvas>, что <img width height>, хотя во втором случае памяти всё равно потребуется больше и потребность этой памяти целиком будет зависеть от браузерной оптимизации. Если используете FileReader, то отсутствие проблем с памятью можно объяснить так: 1) Вы выбираете в input картинки не сразу 50-100 штук за раз, а в 2-3 подхода (при использовании FileReader память, отведённая под длиннющую base64-строку, накапливается только в процессе генерации превью для выбранного набора файлов, как только генерация завершится, через 1-10 сек память освободится, иногда может и не освобождаться, пока страницу не закроешь) 2) У вас было 2Гб свободной оперативки P.S. В любом случае, если вы разрабатываете функционал не для себя, а для людей, нужно использовать canvas , а не отресайзенный <img> . Иначе у людей будут браузеры падать либо превьюшки не будут генерироваться. И то, и другое я уже наблюдал на собственном опыте. Браузеры и падали, и глючили... Вот статья про "прожорливые" браузеры: https://habrahabr.ru/post/208402/ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.05.2017, 00:15 |
|
||
|
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
|
|||
|---|---|---|---|
|
#18+
Cyrax_02, вот такой код Код: javascript 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. памяти 4г загружено дофига , т.е. свап используется по полной. хром. выбираю разово 614 картинок по 2+ мег. время ограничивает только файловые оперции - чтение , и скидывание в свап. в остальном всё быстро. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.05.2017, 09:17 |
|
||
|
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
|
|||
|---|---|---|---|
|
#18+
Cyrax_022) У вас было 2Гб свободной оперативки свободной оперативки 0. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.05.2017, 09:19 |
|
||
|
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
|
|||
|---|---|---|---|
|
#18+
Cyrax_02Вот статья про "прожорливые" браузеры: статья интересная, но там только про использование памяти - а насчёт быстродействия ни слова. мало того, не рассмотрено ухудшение качества при таком подходе для передачи на сервер как правило нжны не превью, а цельные размеры. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.05.2017, 09:49 |
|
||
|
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
|
|||
|---|---|---|---|
|
#18+
авторвот такой кодЧто-то у ваш каша какая-то. Вы читаете файл через FileReader.readAsArrayBuffer(file) , затем из полученного ArrayBuffer создаёте Blob -объект и передаёте его в URL.createObjectURL() . В итоге у вас в памяти картинка хранится в 3 экземплярах - и ArrayBuffer , и Blob-объект, и объект, созданный методом URL.createObjectURL(). И ничего явно не удаляется... Достаточно сразу читать img.src = URL.createObjectURL(file) либо FileReader.readAsDataURL(file) и img.src = e.target.result автормало того, не рассмотрено ухудшение качества при таком подходеУхудшение качества чего ? И при каком подходе ? автордля передачи на сервер как правило нжны не превью, а цельные размеры. Так ведь при передаче на сервер используются объекты File и чтение передаваемых данных производится непосредственно с диска. А то, что городим скриптами для отображения превью - при передаче данных на сервер вообще никак не используется и никак не затрагивается А в статье рассматривают как раз процесс создания превью (перед отправкой данных на сервер) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.05.2017, 16:06 |
|
||
|
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
|
|||
|---|---|---|---|
|
#18+
Cyrax_02Что-то у ваш каша какая-то. Вы читаете файл через FileReader.readAsArrayBuffer(file) , затем из полученного ArrayBuffer создаёте Blob -объект и передаёте его в URL.createObjectURL() . В итоге у вас в памяти картинка хранится в 3 экземплярах - и ArrayBuffer , и Blob-объект, и объект, созданный методом URL.createObjectURL(). И ничего явно не удаляется... мне в итоге нужен бинарный файл, который и передаётся на сервер хранится 2 экземпляра : blob и то что ковертнулось в URL.createObjectURL() ArrayBuffer вроде как пертирается при считывании когда картинка в канвасе ументшается в размере её качество ухудшается, для сохранения качества картинки при уменьшении с использованием катваса надо уменишать размер по шагам , кждый шаг не более чем в 2 раза. Cyrax_02Так ведь при передаче на сервер используются объекты File и чтение передаваемых данных производится непосредственно с диска. А то, что городим скриптами для отображения превью - при передаче данных на сервер вообще никак не используется и никак не затрагивается дак ты ж требовал без повторного считывания, у меня получается счиывается всё в память,а потом из памяти передается. т.е. считывается 1 раз. в практическом примеиении у меня загружается максимум 5 картинок. дляэтого откравается отдельное окно, считали , убедились, что нужное считали - отправили на сервер. 600 картинок это для проверки ... но даже при таком количестве все работает . если не надо бинарных данных, то можно изменить. убрать лишние преобразования будет меньше жрать память. но даже в таком варианте я не жалуюсь на проблемы с памятью. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.05.2017, 16:55 |
|
||
|
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
|
|||
|---|---|---|---|
|
#18+
Cyrax_02А в статье рассматривают как раз процесс создания превью (перед отправкой данных на сервер) у меня есть отдельная страничка, которая подготавливает из исходников и превьюшки 70*60px, и полноразмерные 700*600px ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.05.2017, 16:57 |
|
||
|
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
|
|||
|---|---|---|---|
|
#18+
автормне в итоге нужен бинарный файл, который и передаётся на серверТ.е. передаёте вы на сервер не объект File (данные считываются с диска), а тот самый объект Blob , который получаете из ArrayBuffer ? Зачем именно так ? Скорость чтения с диска всё равно выше скорости передачи по сети. На передаче ничего не выиграете, но зато потеряете в разы больше на показе превью. авторкогда картинка в канвасе ументшается в размере её качество ухудшается, для сохранения качества картинки при уменьшении с использованием катваса надо уменишать размер по шагам , кждый шаг не более чем в 2 раза.Так канвас нужен только для показа превью и всё. Качество здесь, как правило, какой-либо значимой роли не играет. Отправляются-то на сервер всё равно исходные файлы Вот если только на стороне клиента нужно отресайзить и обрезать фото, тогда нужно выбирать - либо канвас (с ручным ресайзом нормальным алгоритмом), либо img с указанием высоты и ширины. Но последний вариант при большом числе картинок на практике неприменим (из-за большого объёма потребляемой памяти). автордак ты ж требовал без повторного считывания, у меня получается счиывается всё в память,а потом из памяти передается. т.е. считывается 1 раз.Задача заключается без повторного считывания файла и превью показать, и объект Blob или ArrayBuffer получить. Но не используя FileReader (который не освобождает память в процессе генерации превью - только через 1-10 сек после завершения генерации или не освобождает вообще, пока не закрыть окно). В вашем примере используется FileReader. И в процессе генерации превью память только накапливается, накапливается, накапливается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.05.2017, 18:33 |
|
||
|
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
|
|||
|---|---|---|---|
|
#18+
Cyrax_02Т.е. передаёте вы на сервер не объект File (данные считываются с диска), а тот самый объект Blob , который получаете из ArrayBuffer ? Зачем именно так ? Скорость чтения с диска всё равно выше скорости передачи по сети. На передаче ничего не выиграете, но зато потеряете в разы больше на показе превью.я передаю бинарные - потомe как это короче чем base64. хоть скорость чтения и большая - всё равно заметная. я считал в память и там всё быстро. время на преобразование в отображение очень маленькое, больше времени тратится на чтение с диска. передаётся на сервер по ws, надо сказать вся отправка происходит "мнгновенно", т.е. фоном . и надо сказать что весь затык - в файловую систему ввода/вывода. Cyrax_02В вашем примере используется FileReader. И в процессе генерации превью память только накапливается, накапливается, накапливается.вполне возможно, но только я не вижу в этом проблемы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.05.2017, 19:03 |
|
||
|
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
|
|||
|---|---|---|---|
|
#18+
Cyrax_02, вот по быстродействию Код: javascript 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. вот временные показатели (чтение 10 файлов по 5 мег 0 SDC11937.JPG чтение: 138ms преобразование: 11.000244140625ms преобразование1: 14ms 1 SDC11954.JPG чтение: 289ms преобразование: 20ms преобразование1: 8ms 2 SDC11960.JPG чтение: 241ms преобразование: 16ms преобразование1: 5ms 3 SDC11964.JPG чтение: 211ms преобразование: 10ms преобразование1: 12ms 4 SDC11961.JPG чтение: 199.999755859375ms преобразование: 23ms преобразование1: 3ms 5 SDC11943.JPG чтение: 155ms преобразование: 11ms преобразование1: 6.999755859375ms 6 SDC11942.JPG чтение: 248.999755859375ms преобразование: 23ms преобразование1: 8.000244140625ms 7 SDC11946.JPG чтение: 405ms преобразование: 20ms преобразование1: 9ms 8 SDC11951.JPG чтение: 193ms преобразование: 9.999755859375ms преобразование1: 8.000244140625ms 9 SDC11932 - копия.JPG чтение: 203ms преобразование: 10ms преобразование1: 8ms ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.05.2017, 20:13 |
|
||
|
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
|
|||
|---|---|---|---|
|
#18+
авторя передаю бинарные - потомe как это короче чем base64 Ну файлы всегда передаются в бинарном виде (multipart/form-data). Зачем передавать объект Blob вместо File ? авторвполне возможно, но только я не вижу в этом проблемы. Если требуется сгенерировать N количество превью за раз, потребуются гигабайты памяти. Сайт (одна страница в браузере) не должна потреблять гигабайты памяти. У пользователей, которые будут загружать файлы через ваш сайт будут проблемы. Слёты и ошибки. Я же давал ссылку на статью - там указаны объёмы потребляемой памяти. Вы же для пользователей делаете функционал ? Не для себя... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.05.2017, 22:14 |
|
||
|
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
|
|||
|---|---|---|---|
|
#18+
Cyrax_02Ну файлы всегда передаются в бинарном виде (multipart/form-data). Зачем передавать объект Blob вместо File ?я пердаю по websocket. там есть два режима передачи - бинарный и текстовый. бинарный быстрее, т.к. меньше на треть тестового. Cyrax_02Если требуется сгенерировать N количество превью за раз, потребуются гигабайты памяти. N - это сколько? при 10 картинках по 5м - страница потребовала 200м. при 600 - да, много памяти , но ни сбоев ни вылетов не было. а кто в здравом уме будет столько за раз грузить? для загрузки фоток у меня открывается страница в новом окне. загрузили - отправили -окно закрылось . да это не для ширпотреба, это вариант для корпоративного использования, где можно разрешить открывать в новом окне/вкладке. но кто мешает сделать подобный элемент dom, который при окончании работы просто удалится из DOM и освободит ресурсы? странно , но в инете куча вопросов и ответов именно на обратное преобразование. а ты не пробовал сделать такое предбразование через canvas? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2017, 08:39 |
|
||
|
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2017, 08:45 |
|
||
|
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
|
|||
|---|---|---|---|
|
#18+
авторN - это сколько? при 10 картинках по 5м - страница потребовала 200м. В зависимости от браузера может потребоваться и 400 Мб, и 600 Мб. По крайней мере, в статье на хабре при использовании FileReader объём потребляемой памяти для jpeg-картинок в 10-12 раз превышает размер этих jpeg-файлов (а у вас к тому же картинки занимают место в памяти в двойном, как минимум, размере - при том коде, который вы показали) авторно ни сбоев ни вылетов не было Раз на раз не приходится и наверняка зависит от браузера Лично наблюдал слёты в Safari. В последнем FF генерируются ошибки в логах. Но даже если все современные браузеры в этом плане стали стабильными (не слетают, а просто генерируют ошибки в логах), то нет гарантии, что все корпоративные пользователи будут пользоваться последними версиями браузеров... P.S. Иными словами, если браузер поддерживает URL API , то нет никаких причин отказываться от URL.createObjectURL()/URL.revokeObject.URL() в пользу FileReader . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2017, 18:33 |
|
||
|
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
|
|||
|---|---|---|---|
|
#18+
В вашем случае по протоколу webSocket нельзя передать объект File вместо Blob ? Т.е. можно только из оперативной памяти передавать данные ? Если можно, то однозначно лучше передавать объект File , а превьюшки генерировать через img.src = URL.createObjectURL() с последующим URL.revokeObjectURL() авторно кто мешает сделать подобный элемент dom, который при окончании работы просто удалится из DOM и освободит ресурсы?Освободит ресурсы, выделенные под DOM-объект, но не освободит ресурсы, выделенные под прочитанный файл (по крайней мере, сразу после удаления DOM-объекта) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2017, 18:33 |
|
||
|
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
|
|||
|---|---|---|---|
|
#18+
Cyrax_02В зависимости от браузера может потребоваться и 400 Мб, и 600 Мб. в моём случае нет необходимости использовать другие браузеры, кроме хрома. корпоративное применение системы позволяет воспользоваться таким преимуществом. Cyrax_02В вашем случае по протоколу webSocket нельзя передать объект File вместо Blob ? Т.е. можно только из оперативной памяти передавать данные ?да. хранение в памяти blob, это не ресурсы dom. поэтому они удаляются сразу. такое чтение reader.readAsArrayBuffer(file) и такое хранение fb['pic' + fb.max] = new Blob([reader.result], {type: "image/jpeg"}); занимают память ровно под размер картинки ну а размер занимаемый под src можно сразу отдать сборщику путём присвоения null. я думаю, что прожорливость не повод для беспокойства. быстродействие имеет больший приоритет. хотя если б удалось добиться решения твоего вопроса - было б несколько лучше. но, порыскав по инету, я не нашёл ничего и это странно. в моём варианте можно воспользоваться и base64 для отображения в src, сократив таким образом количество образов картинок. но потом рередача в текстовом формате base64 или дополнительное преобразование base64 в blob не есть более выйгрышный вариант. ещё раз : при почти нулевой свободной памяти я не увидел больших проблем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2017, 20:13 |
|
||
|
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
|
|||
|---|---|---|---|
|
#18+
Cyrax_02, проверил в мозиле ,опере - 100 картинок держит без проблем.(больше не стал - долго ждать освобождения свопа) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2017, 20:52 |
|
||
|
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
|
|||
|---|---|---|---|
|
#18+
Cyrax_02, мне кажется в той статье не совсем верно показано, что такое занятая память . у него 20 фоток и такие объёмы. я загружаю по 100-400 и нет таких показателей, смотрю диспетчером задач. при наличии свободной памяти - 2гига подимать панику , даже при моём варианте, я не вижу смысла. неужели кто-то допустит загрузку по 100++ фоток? а до 20 - всё прекрасно и замечательно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2017, 07:39 |
|
||
|
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
|
|||
|---|---|---|---|
|
#18+
вадянеужели кто-то допустит загрузку по 100++ фоток? А почему нет? У нас в одном проекте как-то загружали больше 1000 фоток хайрез (по 10+ мб каждая) обследования объектов. При чём делали со слабых компах с маленьким количеством памяти, и никто не жаловался. Потому что мы грузили сразу на сервер и показывали миниатюры с сервера. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2017, 08:15 |
|
||
|
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
|
|||
|---|---|---|---|
|
#18+
hVosttА почему нет? У нас в одном проекте как-то загружали больше 1000 фоток хайрез (по 10+ мб каждая) обследования объектов. При чём делали со слабых компах с маленьким количеством памяти, и никто не жаловался. Потому что мы грузили сразу на сервер и показывали миниатюры с сервера. это как вариант вполне имеет место быть. ия так тоже делал(правда не для такого количества) но это специфическое, корпоративное использование. у Cyrax_02 , как я понимаю, использование для широкого круга. и ему надо убить одновременно десяток зайцев. я его требования понимаю, поэтому тестирую свой вариант, чтоб найти слабые места. в моей области применения, я таковых не наблюдаю. советую и Cyrax_02 его проверить. интересно услышать отзывы о конкретном использовании. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2017, 08:33 |
|
||
|
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
|
|||
|---|---|---|---|
|
#18+
вадяинтересно услышать отзывы о конкретном использовании. Я в вашу дискуссию не лезу :) Просто меня зацепило вот это: вадянеужели кто-то допустит загрузку по 100++ фоток? Сразу вспоминается боян про «640 кб хватит всем!!!», и я с этим периодически сталкиваюсь, когда кто-то начинает делать скорополительные выводы типа - да кто будет вводить в этом поле больше 100 символов? это же бред? зачем делать проверку? - да кто будет сюда нажимать? никто! не буду обрабатывать. - да кто будет нажимать Back в браузере? покажите этих людей! - да кто будет вводить скрипты и HTML в textarea? это же обычные пользователи, не буду фильтровать! - да кто будет загружать 100++ фоток?... Я хочу акцентировать внимание на том, что программист должен предусматривать все возможные варианты и решать их до того, как проблема наступит, по возможности, а не прикрываться тезисами о том, что типа так делать никто не будет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2017, 09:52 |
|
||
|
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
|
|||
|---|---|---|---|
|
#18+
hVosttЯ в вашу дискуссию не лезу :) Просто меня зацепило вот это: не надо воспринимать это замечание так буквально. :) просто для общественных серверов(на что и ориентирован Cyrax_02 ) возмозможность неограниченной загрузки чревата многими последствиями. умников хватает. в корпоративном секторе - заблаговременно расчитывается и большие объёмы вполне допустимы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2017, 10:35 |
|
||
|
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
|
|||
|---|---|---|---|
|
#18+
вадя, Если исходить из самого смысла производства ПО: а это прямая или косвенная выгода, то разработчик прежде всего должен заботиться о комфорте пользователя. Пользователь понятия не имеет ни о каком свопе, и если он захочет загрузить 100++ фоток, он их загрузит. Если пот этом он столкнётся с тем, что комп встанет колом, он пошлёт нафиг такой сайт и уйдёт к конкуренту. Такие соображения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2017, 12:18 |
|
||
|
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
|
|||
|---|---|---|---|
|
#18+
hVosttТакие соображения. дак поэтому я и привожу результаты по загрузке 600 картинок ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2017, 12:52 |
|
||
|
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
|
|||
|---|---|---|---|
|
#18+
вадяhVosttТакие соображения. дак поэтому я и привожу результаты по загрузке 600 картинок Это хорошее дело! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2017, 12:58 |
|
||
|
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
|
|||
|---|---|---|---|
|
#18+
авторну а размер занимаемый под src можно сразу отдать сборщику путём присвоения null. А вы думаете, сборщик запускается сразу после исчезновения необходимости в хранении некоторых данных в оперативной памяти ? Однозначно нет. Если присвоить ( src = null ), память не освободится. Освободится, только после того, как все превьюшки будут сгенерированы (по моим наблюдениям, через 1-10 сек либо только после закрытия/перезагрузки страницы) авторхранение в памяти blob, это не ресурсы dom. поэтому они удаляются сразу. А кто освобождает память, отведённую под Blob ? Тот же сборщик. А когда запускается сборщик - см. комментарий выше. авторя думаю, что прожорливость не повод для беспокойства. быстродействие имеет больший приоритет. На первом месте всегда находится безсбойность и стабильность работы кода. И если стабильность зависит от прожорливости, то прожорливость выходит вперёд по сравнению с быстродействием. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2017, 13:14 |
|
||
|
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
|
|||
|---|---|---|---|
|
#18+
авторв моём варианте можно воспользоваться и base64 для отображения в src, сократив таким образом количество образов картинок. но потом рередача в текстовом формате base64 или дополнительное преобразование base64 в blob не есть более выйгрышный вариант. ещё раз : при почти нулевой свободной памяти я не увидел больших проблем. В вашем случае, как минимум, нужно использовать URL.revokeObjectURL() после использования объектной ссылки . На один "образ" будет меньше. Ну а почему вы на вашем конкретном браузере конкретной версии не видите никаких проблем - причины очевидно есть, но они никоим образом не связаны с вашим программным кодом. Наблюдения пользователей показывают, что при проблемы бывают и при таком коде их вероятность высока. авторещё раз : при почти нулевой свободной памяти я не увидел больших проблем. У меня на последней верcии FF при 3Гб оперативки (столько же свопа), когда оперативка почти полностью занята и браузеру достаётся только своп, при использовании FileReader.readAsObjectURL() из 5-10 картинок по 4Мб превью генерируются только для трети из них (и с тормозами), для остальных в логах вылезают критические ошибки. При использовании URL.CreateObjectURL()/revokeObjectURL() даже если оперативка под завяку занята, все превьюшки генерируются без ошибок и без тормозов. Пример весьма показателен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2017, 13:14 |
|
||
|
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
|
|||
|---|---|---|---|
|
#18+
Что касается той статьи на хабре, там действительно большие объёмы памяти потребляются. Но я проверял с FileReader.readAsObjectURL() . Действительно, потребляются большие объёмы памяти. Почему у вас нет проблем, даже при масштабном использовании свопа - можно предположить, что: а) FileReader.readAsArrayBuffer() + Blob + ArrayBuffer => за счёт грамотной работы сборщика (а работа сборщика может зависеть и от ОС) в памяти хранится только один экземпляр данных картинки б) эффективная и корректная работа свопа (браузер + ОС) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2017, 13:27 |
|
||
|
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
|
|||
|---|---|---|---|
|
#18+
Cyrax_02В вашем случае, как минимум, нужно использовать URL.revokeObjectURL() после использования объектной ссылки .это правильное замечание, только я не смог сообразить где его лучше вставить... Cyrax_02Ну а почему вы на вашем конкретном браузере конкретной версии не видите никаких проблем - причины очевидно есть, но они никоим образом не связаны с вашим программным кодом вот это интересный вывод. я тоже хотел знать. но дитя не плачет - мать не разумеет. Cyrax_02У меня на последней верcии FF при 3Гб оперативки (столько же свопа), у меня win10, 4гига , оперативка под завязку - netbeans, mysql, dbForge, мозилла (10-15 вкладок), хром, скайп, java, tomcat... и клиет и сервер всё на одной машине. 600 картинок без труда. только диск стонет.... ноут 11 года. может у тебя проблемы с диском? дефрагментация? перегрев? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2017, 14:21 |
|
||
|
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
|
|||
|---|---|---|---|
|
#18+
авторэто правильное замечание, только я не смог сообразить где его лучше вставить...В обработчике события "onload" DOM-объекта, соответствующего <img> (обработчик ставить перед image.src = ... ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2017, 15:12 |
|
||
|
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
|
|||
|---|---|---|---|
|
#18+
Cyrax_02В обработчике события "onload" DOM-объекта, соответствующего <img> (обработчик ставить перед image.src = ... )в такой конструкции Код: javascript 1. 2. 3. 4. 5. 6. 7. 8. где? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2017, 17:26 |
|
||
|
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
|
|||
|---|---|---|---|
|
#18+
Например, так: Код: javascript 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2017, 01:07 |
|
||
|
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
|
|||
|---|---|---|---|
|
#18+
вадяв такой конструкции твой код читать - глаза сломаешь (форматирование). Учись у Cyrax_02. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2017, 11:15 |
|
||
|
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
|
|||
|---|---|---|---|
|
#18+
Cyrax_02, спасибо, что уделил внимание моему коду. благодаря тебе я смог избавиться от jquery :) $('#pic_div').append( и есть интересное наблюдение: у тебя есть такое $(image).one('load', function(e) {... в последних весиях (по крайней мере хрома) это стало необходимо. но! при таком использовании Код: javascript 1. 2. 3. необходимости в этом нет. потому как это urlFactory.createObjectURL(fb['pic' + fb.max]) в итоге строка, и в момент формирования основной строки это urlFactory.createObjectURL(fb['pic' + fb.max]) вызывается как "функция", которая выполняется не в фоновом режиме. (в отличие от твоего варианта) и никакого лишнего элемента не создается, результат - простая строка - ссылка на память. ... я так думаю.... хотя могу ошибаться. при указании реального uri картинки - происходит загрузка картинки с ссервера. что происходит при при указании src='blob:http://www.site.ru/17b3ab49-dbc2-48e5-afc2-be1d64cec7ef' не понятно, перегружается ли в область для src, либо src по этой ссылке "подключается" к памяти поуказанию этой ссылки. по-моему мнению - второе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2017, 13:00 |
|
||
|
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
|
|||
|---|---|---|---|
|
#18+
авторблагодаря тебе я смог избавиться от jquery :) $('#pic_div').append(А при чём здесь мой код ? И твой код, и мой - используют jquery. Впрочем, переделать на чистый javascript не сложно... автор$(image).one('load', function(e) {... в последних весиях (по крайней мере хрома) это стало необходимо.Не понятно, что именно необходимо ? Здесь вешается обработчик на событие "onload". В этом обработчике освобождается память, отведённая под объект, созданный методом URL.createObjectURL() . Данные действия обусловлены исключительно логикой кода, а не версией браузера. авторнеобходимости в этом нет. потому как это urlFactory.createObjectURL(fb['pic' + fb.max]) в итоге строка, и в момент формирования основной строки это urlFactory.createObjectURL(fb['pic' + fb.max]) вызывается как "функция", которая выполняется не в фоновом режиме. (в отличие от твоего варианта) и никакого лишнего элемента не создается, результат - простая строка - ссылка на память.В чём нет необходимости ? DOM-объект <img> создаётся отдельно для того, чтобы повесить на него обработчик события загрузки картинки "onload", в котором выполняется освобождение памяти, отведённой под объект, созданный методом URL.createObjectURL() . Загрузка картинки начинается асинхронно сразу после присваивания img.src=... После выполнения вашего изначального кода картинка ещё не загружена (не отрендерина). Чтобы отловить момент, когда она завершит загрузку (рендеринг), и нужен обработчик события "onload". Освобождать память, отведённую под объект, созданный методом URL.createObjectURL() , можно только после завершения загрузки (рендеринга) картинки. авторпри указании реального uri картинки - происходит загрузка картинки с ссервера. что происходит при при указании src='blob:http://www.site.ru/17b3ab49-dbc2-48e5-afc2-be1d64cec7ef' не понятноЯ же написал в первых постах, что метод URL.createObjectURL() создаёт в оперативной памяти специальный объект и возвращает на него строковую объектную ссылку специального формата, которую можно присваивать img.src . В этом случае картинка загружается (рендерится) из этого специального объекта, на который указывает эта специальная ссылка. После завершения рендеринга картинки этот специальный объект остаётся в памяти и его нужно (желательно) явно освобождать методом URL.revokeObjectURL() . И освобождать только после того, как завершится рендеринг картинки (событие "onload"). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2017, 13:37 |
|
||
|
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
|
|||
|---|---|---|---|
|
#18+
Cyrax_02, сделал я удаление... может что-то и изменилось, но никак я не смог этого заметить этого. добиться обвала браузера мне не удалось. попробуй сделать своп 6-8гиг. у меня при 4 гигах озу свар 15гиг(я знаю, что это бессмысленно, но ...) так при загрузке картинок показывает использование "памяти" 7+ гиг ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2017, 23:16 |
|
||
|
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
|
|||
|---|---|---|---|
|
#18+
Cyrax_02, а рендеринг картинок происходит на на событии onload. рендеринг проимходит в момент первого появления картинки на экране. это проявляется в виде задержки , дергании, рывках при первом скролинге картинок. в дальнейшем скролинге всё прокручивается плавно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2017, 23:20 |
|
||
|
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
|
|||
|---|---|---|---|
|
#18+
авторможет что-то и изменилось, но никак я не смог этого заметить этого.Зато по фэншую... автора рендеринг картинок происходит на на событии onload. рендеринг проимходит в момент первого появления картинки на экране. это проявляется в виде задержки , дергании, рывках...Картинка начинает рендериться в момент присваивания img.src = ... (либо создания/добавления узла img с указанным src , как в вашем изначальном коде), завершается рендеринг непосредственно перед генерацией события "onload" (или "onerror" - при ошибках рендеринга). А " момент первого появления картинки " - это момент после завершения рендеринга этой самой картинки. Что у вас там тормозит и когда - всецело зависит от логики кода (вы же не одну картинку загружаете и отображаете) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2017, 05:45 |
|
||
|
|

start [/forum/topic.php?all=1&fid=22&tid=1444597]: |
0ms |
get settings: |
10ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
47ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
70ms |
get tp. blocked users: |
1ms |
| others: | 276ms |
| total: | 435ms |

| 0 / 0 |
