Войти
ПрограммированиеФорумВеб

JavaScript (RangeError: Invalid array buffer length)

#0
9:56, 5 ноя. 2014

Приветствую,

В моем web-приложении присутствует аллокация памяти значительного объема (порядка 512 mb)

var buffer = new ArrayBuffer(_mem_size); // размер памяти задается в байтах и соответствует объему 512 mb // приложение падает именно в момент создания ArrayBuffer // _mem_size константа и никак не вычисляется (там сразу задан нужный объем памяти)

На моем рабочем компьютере все работает отлично, но как только пытаюсь запустить тоже самое на чем то более днищенском - получаю Exception: RangeError: Invalid array buffer length

Особенно часто это проявляется на ноутбуках.
Например, запускаю на ноутбуке где 3 Гб ОЗУ, браузер Chrome (точно версию не помню, но какая-то из последних) и получаю Invalid array buffer length не смотря на то, что
на момент запуска свободно более 1 Гб оперативы - вопрос, почему в данном случае браузер не может получить требуемых 512 mb, если видно, что свободная память в данный момент есть?

Может быть где-то в настройках браузеров выставляются ограничения на максимальный объем оперативы, который он может использовать, в настройках ОС, в настройках антивируса? - я не нашел нигде...
поэтому не понятно, что может быть причиной  исключения Invalid array buffer length

---
P.S.: если уменьшить объем выделяемой памяти до 128 mb, то ошибка исчезает и на днищестких ноутбуках, но для моих нужд 512 это минимум...

 


#1
11:58, 5 ноя. 2014

и чего ты хочешь в этой теме ? чтобы тебе сказали что веб приложение требующее мин 512мб - это плохое продуманное приложение ?

#2
13:52, 5 ноя. 2014

Чем вопрос не понятен:

почему в данном случае [b]браузер не может получить требуемых 512 mb[/b], если [b]видно, что свободная память в данный момент есть?[/b]
----
веб приложение требующее мин 512мб - это плохое продуманное приложение ?

Подскажи как можно обойтись меньшей памятью, если нужно рендерить модели, где одна деталь полтора миллиона полигонов?  (оптимизировать модели нельзя - это не от меня зависит)

У меня итак сцена динамически строится, но 512 mb минимум из -за здоровых мешей. У меня сейчас и крашится алокация во время загрузки - я не могу достаточно памяти получить, чтобы сцену построить, если работа идет на ноуте.

----
P.S.: 512 mb - это кстати не много.

#3
14:07, 5 ноя. 2014

ну допустим. а в браузере это делать зачем ?

ps. Одна модель на 1.5м полигонов, так навскидку, не может превышать 50мб + текстуры (которые используют видео память)

#4
14:17, 5 ноя. 2014
ну допустим. а в браузере это делать зачем ?

Потому что заказчику нужен либо Flash, либо WebGL. Flash - это полутруп, поэтому остается WebGL. 

ps. Одна модель на 1.5м полигонов, так навскидку, не может превышать 50мб + текстуры (которые используют видео память)

В сжатом виде, до того как я её распаковываю в памяти, она уже вести 90 mb ))

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

#5
15:41, 5 ноя. 2014

Bave
Пару минут погуглил - выяснил что в какой то версии Хрома был такой баг - значит стоит обновить браузер.

#6
18:26, 5 ноя. 2014

Bave
> на момент запуска свободно более 1 Гб оперативы - вопрос, почему в данном
> случае браузер не может получить требуемых 512 mb, если видно, что свободная
> память в данный момент есть?
Ты ведь просишь 512мб одним куском, а такого может и не оказаться. Связь с количеством свободной оперативы лишь косвенная.

#7
14:32, 16 фев. 2015

Есть такая вещь, как фрагментация виртуального адресного пространства. Это 32-битная архитектура трещит, упираясь рогами в потолок.
Если у тебя два гига свободной памяти, а адресное пространство приложения свободно кусками по 490 мегабайт, то хрен ты выделишь кусок в 512 мегабайт. Вне зависимости от языка программирования.
А ещё есть такая радость, как резервирование адресного пространства под стек. Вроде немного, но если экзешник плодит 100500 потоков, каждый со своим стеком, они легко могут выжрать виртуальное адресное пространство, и тогда всё равно сколько свободной памяти у системы, приложению некуда её отобразить.
ЕМНИП, хром любит плодить потоки и процессы стадами, делая из твоего десктопа филиал сервера для нужд гугла и занимаясь неизвестно чем.
А ещё DLL'ы любят грузиться в самые разные адреса, тем самым разрубая адресное пространство екзешника на части.

#8
18:35, 16 фев. 2015

  Попробуй создавать меньше мелких буферов. Ну знаете, вся эта фигня - один для координат, второй для индексов, третий для какой-нибудь фигни, не обязательно же всё в один пихать. Просто может быть дело в том, что память в браузере поделена на блоки для удобства сборки мусора (вы ведь её не очищаете, верно, значит должен кто-то за этим следить), куда все 500 метров за раз не помещаются, но может быть если разбить, то всё влезет. А уже всякая там фрагментация, размер страниц и прочая системная срань просто стоит на втором месте.

Cheb
> Вроде немного, но если экзешник плодит 100500 потоков
  Это когда это у нас JS хотя бы два потока нормально ел? Не знаю как сейчас всякие хромы, но старую оперу просто невозможно было заставить загрузить больше одного ядра.

ПрограммированиеФорумВеб

Тема в архиве.