powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / (js) Как из URL.createObjectURL() получить ArrayBuffer ?
25 сообщений из 50, страница 2 из 2
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
    #39464056
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторN - это сколько? при 10 картинках по 5м - страница потребовала 200м.
В зависимости от браузера может потребоваться и 400 Мб, и 600 Мб.
По крайней мере, в статье на хабре при использовании FileReader объём потребляемой памяти для jpeg-картинок в 10-12 раз превышает размер этих jpeg-файлов (а у вас к тому же картинки занимают место в памяти в двойном, как минимум, размере - при том коде, который вы показали)

авторно ни сбоев ни вылетов не было
Раз на раз не приходится и наверняка зависит от браузера
Лично наблюдал слёты в Safari. В последнем FF генерируются ошибки в логах.

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

P.S. Иными словами, если браузер поддерживает URL API , то нет никаких причин отказываться от URL.createObjectURL()/URL.revokeObject.URL() в пользу FileReader .
...
Рейтинг: 0 / 0
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
    #39464057
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В вашем случае по протоколу webSocket нельзя передать объект File вместо Blob ? Т.е. можно только из оперативной памяти передавать данные ? Если можно, то однозначно лучше передавать объект File , а превьюшки генерировать через img.src = URL.createObjectURL() с последующим URL.revokeObjectURL()

авторно кто мешает сделать подобный элемент dom, который при окончании работы просто удалится из DOM и освободит ресурсы?Освободит ресурсы, выделенные под DOM-объект, но не освободит ресурсы, выделенные под прочитанный файл (по крайней мере, сразу после удаления DOM-объекта)
...
Рейтинг: 0 / 0
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
    #39464105
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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 не есть более выйгрышный вариант.
ещё раз : при почти нулевой свободной памяти я не увидел больших проблем.
...
Рейтинг: 0 / 0
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
    #39464130
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cyrax_02,
проверил в мозиле ,опере - 100 картинок держит без проблем.(больше не стал - долго ждать освобождения свопа)
...
Рейтинг: 0 / 0
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
    #39464220
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cyrax_02,

мне кажется в той статье не совсем верно показано, что такое занятая память .
у него 20 фоток и такие объёмы. я загружаю по 100-400 и нет таких показателей, смотрю диспетчером задач.
при наличии свободной памяти - 2гига подимать панику , даже при моём варианте, я не вижу смысла.
неужели кто-то допустит загрузку по 100++ фоток?
а до 20 - всё прекрасно и замечательно.
...
Рейтинг: 0 / 0
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
    #39464232
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадянеужели кто-то допустит загрузку по 100++ фоток?

А почему нет? У нас в одном проекте как-то загружали больше 1000 фоток хайрез (по 10+ мб каждая) обследования объектов. При чём делали со слабых компах с маленьким количеством памяти, и никто не жаловался. Потому что мы грузили сразу на сервер и показывали миниатюры с сервера.
...
Рейтинг: 0 / 0
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
    #39464242
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttА почему нет? У нас в одном проекте как-то загружали больше 1000 фоток хайрез (по 10+ мб каждая) обследования объектов. При чём делали со слабых компах с маленьким количеством памяти, и никто не жаловался. Потому что мы грузили сразу на сервер и показывали миниатюры с сервера.
это как вариант вполне имеет место быть. ия так тоже делал(правда не для такого количества) но это специфическое, корпоративное использование.
у Cyrax_02 , как я понимаю, использование для широкого круга. и ему надо убить одновременно десяток зайцев. я его требования понимаю, поэтому тестирую свой вариант, чтоб найти слабые места. в моей области применения, я таковых не наблюдаю. советую и Cyrax_02 его проверить. интересно услышать отзывы о конкретном использовании.
...
Рейтинг: 0 / 0
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
    #39464296
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадяинтересно услышать отзывы о конкретном использовании.

Я в вашу дискуссию не лезу :) Просто меня зацепило вот это:


вадянеужели кто-то допустит загрузку по 100++ фоток?

Сразу вспоминается боян про «640 кб хватит всем!!!», и я с этим периодически сталкиваюсь, когда кто-то начинает делать скорополительные выводы типа

- да кто будет вводить в этом поле больше 100 символов? это же бред? зачем делать проверку?
- да кто будет сюда нажимать? никто! не буду обрабатывать.
- да кто будет нажимать Back в браузере? покажите этих людей!
- да кто будет вводить скрипты и HTML в textarea? это же обычные пользователи, не буду фильтровать!
- да кто будет загружать 100++ фоток?...

Я хочу акцентировать внимание на том, что программист должен предусматривать все возможные варианты и решать их до того, как проблема наступит, по возможности, а не прикрываться тезисами о том, что типа так делать никто не будет
...
Рейтинг: 0 / 0
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
    #39464338
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttЯ в вашу дискуссию не лезу :) Просто меня зацепило вот это:
не надо воспринимать это замечание так буквально. :)
просто для общественных серверов(на что и ориентирован Cyrax_02 ) возмозможность неограниченной загрузки чревата многими последствиями. умников хватает.
в корпоративном секторе - заблаговременно расчитывается и большие объёмы вполне допустимы.
...
Рейтинг: 0 / 0
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
    #39464539
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадя,

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

Такие соображения.
...
Рейтинг: 0 / 0
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
    #39464587
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttТакие соображения.
дак поэтому я и привожу результаты по загрузке 600 картинок
...
Рейтинг: 0 / 0
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
    #39464595
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадяhVosttТакие соображения.
дак поэтому я и привожу результаты по загрузке 600 картинок

Это хорошее дело!
...
Рейтинг: 0 / 0
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
    #39464618
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторну а размер занимаемый под src можно сразу отдать сборщику путём присвоения null.
А вы думаете, сборщик запускается сразу после исчезновения необходимости в хранении некоторых данных в оперативной памяти ?
Однозначно нет. Если присвоить ( src = null ), память не освободится. Освободится, только после того, как все превьюшки будут сгенерированы (по моим наблюдениям, через 1-10 сек либо только после закрытия/перезагрузки страницы)

авторхранение в памяти blob, это не ресурсы dom. поэтому они удаляются сразу.
А кто освобождает память, отведённую под Blob ? Тот же сборщик. А когда запускается сборщик - см. комментарий выше.

авторя думаю, что прожорливость не повод для беспокойства. быстродействие имеет больший приоритет.
На первом месте всегда находится безсбойность и стабильность работы кода. И если стабильность зависит от прожорливости, то прожорливость выходит вперёд по сравнению с быстродействием.
...
Рейтинг: 0 / 0
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
    #39464619
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторв моём варианте можно воспользоваться и base64 для отображения в src, сократив таким образом количество образов картинок. но потом рередача в текстовом формате base64 или дополнительное преобразование base64 в blob не есть более выйгрышный вариант.
ещё раз : при почти нулевой свободной памяти я не увидел больших проблем.
В вашем случае, как минимум, нужно использовать URL.revokeObjectURL() после использования объектной ссылки . На один "образ" будет меньше. Ну а почему вы на вашем конкретном браузере конкретной версии не видите никаких проблем - причины очевидно есть, но они никоим образом не связаны с вашим программным кодом. Наблюдения пользователей показывают, что при проблемы бывают и при таком коде их вероятность высока.

авторещё раз : при почти нулевой свободной памяти я не увидел больших проблем.
У меня на последней верcии FF при 3Гб оперативки (столько же свопа), когда оперативка почти полностью занята и браузеру достаётся только своп, при использовании FileReader.readAsObjectURL() из 5-10 картинок по 4Мб превью генерируются только для трети из них (и с тормозами), для остальных в логах вылезают критические ошибки. При использовании URL.CreateObjectURL()/revokeObjectURL() даже если оперативка под завяку занята, все превьюшки генерируются без ошибок и без тормозов. Пример весьма показателен.
...
Рейтинг: 0 / 0
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
    #39464629
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что касается той статьи на хабре, там действительно большие объёмы памяти потребляются. Но я проверял с FileReader.readAsObjectURL() . Действительно, потребляются большие объёмы памяти. Почему у вас нет проблем, даже при масштабном использовании свопа - можно предположить, что:

а) FileReader.readAsArrayBuffer() + Blob + ArrayBuffer => за счёт грамотной работы сборщика (а работа сборщика может зависеть и от ОС) в памяти хранится только один экземпляр данных картинки
б) эффективная и корректная работа свопа (браузер + ОС)
...
Рейтинг: 0 / 0
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
    #39464685
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cyrax_02В вашем случае, как минимум, нужно использовать URL.revokeObjectURL() после использования объектной ссылки .это правильное замечание, только я не смог сообразить где его лучше вставить...
Cyrax_02Ну а почему вы на вашем конкретном браузере конкретной версии не видите никаких проблем - причины очевидно есть, но они никоим образом не связаны с вашим программным кодом
вот это интересный вывод. я тоже хотел знать. но дитя не плачет - мать не разумеет.
Cyrax_02У меня на последней верcии FF при 3Гб оперативки (столько же свопа),
у меня win10, 4гига , оперативка под завязку - netbeans, mysql, dbForge, мозилла (10-15 вкладок), хром, скайп, java, tomcat...
и клиет и сервер всё на одной машине.
600 картинок без труда. только диск стонет....
ноут 11 года.
может у тебя проблемы с диском? дефрагментация? перегрев?
...
Рейтинг: 0 / 0
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
    #39464762
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторэто правильное замечание, только я не смог сообразить где его лучше вставить...В обработчике события "onload" DOM-объекта, соответствующего <img> (обработчик ставить перед image.src = ... )
...
Рейтинг: 0 / 0
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
    #39464908
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cyrax_02В обработчике события "onload" DOM-объекта, соответствующего <img> (обработчик ставить перед image.src = ... )в такой конструкции
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
 reader.onloadend = function () {
                     fb['pic' + fb.max] = new Blob([reader.result], {type: "image/jpeg"});
                     $('#pic_div').append('<div class="pic_num" data-pic="' + fb.max + '">\n\
                    <div class="pic_title new_pic">\n\
                    <button class="bt_del"><img class="pic_del" src="pic/del_.png" alt="" /></button><span></span>\n\
                    </div>\n\
                    <img src="' + urlFactory.createObjectURL(fb['pic' + fb.max]) + '" alt=""/>\n\
                    </div>');


где?
...
Рейтинг: 0 / 0
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
    #39465063
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.
reader.onloadend = function (e) {
   if(event.target.error) {
      console.log(e.target.error);
   } else {
      fb['pic' + fb.max] = new Blob([e.target.result], {type: "image/jpeg"});

      var image = document.createElement('img');
      $(image).one('load', function(e) {
         if(urlFactory) { urlFactory.revokeObjectURL(e.target.src); }

         $('#pic_div').append('<div class="pic_num" data-pic="' + fb.max + '">\n\
           <div class="pic_title new_pic">\n\
              <button class="bt_del"><img class="pic_del" src="pic/del_.png" alt="" /></button><span></span>\n\
           </div>\n\
        </div>').find('.new_pic').after(image);
      });
      $(image).on('error', function(e) {
           if(urlFactory) { urlFactory.revokeObjectURL(e.target.src); }
        }
      image.src = urlFactory.createObjectURL(fb['pic' + fb.max]);
   }
}
...
Рейтинг: 0 / 0
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
    #39465115
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадяв такой конструкции
твой код читать - глаза сломаешь (форматирование).
Учись у Cyrax_02.
...
Рейтинг: 0 / 0
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
    #39465134
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cyrax_02,
спасибо, что уделил внимание моему коду.
благодаря тебе я смог избавиться от jquery :) $('#pic_div').append(
и есть интересное наблюдение:
у тебя есть такое
$(image).one('load', function(e) {...
в последних весиях (по крайней мере хрома) это стало необходимо.
но!
при таком использовании
Код: javascript
1.
2.
3.
el_pic_div.insertAdjacentHTML('beforeEnd', '<div class="pic_num" data-pic="' + fb.max + '">\n\
   <div class="pic_title new_pic"><button class="bt_del"><img class="pic_del" src="pic/del_.png" alt="" /></button> <span></span></div>\n\
   <img src="' + urlFactory.createObjectURL(fb['pic' + fb.max]) + '" alt=""/></div>');


необходимости в этом нет. потому как это 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 по этой ссылке "подключается" к памяти поуказанию этой ссылки. по-моему мнению - второе.
...
Рейтинг: 0 / 0
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
    #39465151
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторблагодаря тебе я смог избавиться от 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").
...
Рейтинг: 0 / 0
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
    #39465608
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cyrax_02,
сделал я удаление...
может что-то и изменилось, но никак я не смог этого заметить этого.
добиться обвала браузера мне не удалось.
попробуй сделать своп 6-8гиг. у меня при 4 гигах озу свар 15гиг(я знаю, что это бессмысленно, но ...) так при загрузке картинок показывает использование "памяти" 7+ гиг
...
Рейтинг: 0 / 0
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
    #39465609
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cyrax_02,
а рендеринг картинок происходит на на событии onload. рендеринг проимходит в момент первого появления картинки на экране. это проявляется в виде задержки , дергании, рывках при первом скролинге картинок. в дальнейшем скролинге всё прокручивается плавно
...
Рейтинг: 0 / 0
(js) Как из URL.createObjectURL() получить ArrayBuffer ?
    #39465650
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторможет что-то и изменилось, но никак я не смог этого заметить этого.Зато по фэншую...

автора рендеринг картинок происходит на на событии onload. рендеринг проимходит в момент первого появления картинки на экране. это проявляется в виде задержки , дергании, рывках...Картинка начинает рендериться в момент присваивания img.src = ... (либо создания/добавления узла img с указанным src , как в вашем изначальном коде), завершается рендеринг непосредственно перед генерацией события "onload" (или "onerror" - при ошибках рендеринга).

А " момент первого появления картинки " - это момент после завершения рендеринга этой самой картинки.
Что у вас там тормозит и когда - всецело зависит от логики кода (вы же не одну картинку загружаете и отображаете)
...
Рейтинг: 0 / 0
25 сообщений из 50, страница 2 из 2
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / (js) Как из URL.createObjectURL() получить ArrayBuffer ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]