Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 23.07.2019, 23:55
Интересующийся
Отправить личное сообщение для NiOl Посмотреть профиль Найти все сообщения от NiOl
 
Регистрация: 11.06.2017
Сообщений: 15

Как добавлять элементы в типизированный массив?
Оказывается, push() с типизированными массивами не работает, присваивание по новому индексу тоже ничего не дает. Количество элементов заранее неизвестно. Как быть?

my_bf=new Uint8Array(0);
my_bf[0]=1;
my_bf[1]=2; //  для примера только 2 элемента
alert(my_bf.length); // длина осталась = 0


В крайнем случае можно подготовить данные в Array, а затем сконвертить в байты, но это потребление лишней оперативки (минимум в 4 раза больше), а количество элементов может доходить до сотни лямов и плюс лишнее действие на конвертирование, старые компы могут не потянуть, не говоря об телефонах.
Ответить с цитированием
  #2 (permalink)  
Старый 24.07.2019, 08:20
Аватар для SuperZen
Профессор
Отправить личное сообщение для SuperZen Посмотреть профиль Найти все сообщения от SuperZen
 
Регистрация: 08.11.2017
Сообщений: 642

https://developer.mozilla.org/ru/doc...Array#Examples
// From an iterable 
var iterable = function*(){ yield* [1,2,3]; }(); 
var uint8 = new Uint8Array(iterable);
Ответить с цитированием
  #3 (permalink)  
Старый 24.07.2019, 10:40
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,005

Uint8Array - это непрерывный кусок памяти. Его нельзя увеличивать. Так исторически сложилось, причём задолго до появления js. Единственный способ его "увеличить" - это создать новый, более крупный кусок, и скопировать данные из старого куска, старый передать сборщику мусора. В твоём случае, когда данные появляются постепенно, оптимальной будет стратегия с удвоением размера буфера - дополнительных издержек выходит где-то на 2N по памяти и примерно столько же копирований.
А вообще - какая задача? Нафига понадобилось все данные в массив запихнуть?
Ответить с цитированием
  #4 (permalink)  
Старый 24.07.2019, 16:59
Интересующийся
Отправить личное сообщение для NiOl Посмотреть профиль Найти все сообщения от NiOl
 
Регистрация: 11.06.2017
Сообщений: 15

SuperZen,
Вчера смотрел эту публикацию, перед созданием темы. Поскольку типизированный массив не может создаться внезапно, Иттератор в данном случае будет заполнять обычный массив, (32бита на элемент, по-умолчанию) а потом перенесет все в байтовый. Вариант некрасивый.

Alexandroppolus,
Была мысль вообще создать 2-мерный массив с небольшими блоками по 16-32 байта и добавлять очередной блок по достижении границы... Некрасиво все это, в итоге вообще выйдет 4-мерный массив )))

* обрабатываю картинку, теоретически не более 50мпх (примерно на этом размере 32-битный фаяфокс-49 начинает подвисать. На выходе у меня 16 вариантов цветового решения на выбор пользователю, у каждого варианта до 16 (может уменьшу до 8) подвариантов конечной обработки. Уже 2-мерный массив, и еще помножить на список блоков, вот 4-мерность и получается ))))
Ответить с цитированием
  #5 (permalink)  
Старый 24.07.2019, 17:17
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,005

Сообщение от NiOl
обрабатываю картинку, теоретически не более 50мпх (примерно на этом размере 32-битный фаяфокс-49 начинает подвисать.
ты это в браузере делашь, через канву? Но тогда у тебя данные уже в бинарном массиве - getImageData возвращает структурку с таким массивом. Зачем ещё один массив?
Ответить с цитированием
  #6 (permalink)  
Старый 25.07.2019, 13:22
Интересующийся
Отправить личное сообщение для NiOl Посмотреть профиль Найти все сообщения от NiOl
 
Регистрация: 11.06.2017
Сообщений: 15

В "канве" превьюшки, данные отдельно )))
Пока склоняюсь к списку блоков по 256 байт. Нет времени попробовать.
Ответить с цитированием
  #7 (permalink)  
Старый 25.07.2019, 13:45
Аватар для SuperZen
Профессор
Отправить личное сообщение для SuperZen Посмотреть профиль Найти все сообщения от SuperZen
 
Регистрация: 08.11.2017
Сообщений: 642

Сначал
Сообщение от NiOl Посмотреть сообщение
Количество элементов заранее неизвестно.
Потом
Сообщение от NiOl Посмотреть сообщение
* обрабатываю картинку, теоретически не более 50мпх
Проще сначала посчитать сколько надо и создать уже готовый вариант
new Uint8Array(x*y)
Ответить с цитированием
  #8 (permalink)  
Старый 25.07.2019, 14:54
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,005

Сообщение от NiOl
данные отдельно
и откуда берутся эти данные? просто интересно, как можно получить данные по пикселям изображения, причем не в виде бинарного массива, да ещё и таким образом, чтобы на момент получения первого пикселя было неизвестно, сколько их всего. Мутная какая-то история.
Ответить с цитированием
  #9 (permalink)  
Старый 01.08.2019, 00:14
Интересующийся
Отправить личное сообщение для NiOl Посмотреть профиль Найти все сообщения от NiOl
 
Регистрация: 11.06.2017
Сообщений: 15

Сообщение от Alexandroppolus Посмотреть сообщение
и откуда берутся эти данные? просто интересно, как можно получить данные по пикселям изображения, причем не в виде бинарного массива, да ещё и таким образом, чтобы на момент получения первого пикселя было неизвестно, сколько их всего. Мутная какая-то история.
Главное, чтоб не криминальная )))

Мучаю конвертор графики под одну ретросистему. Пытаюсь не только в палитру попасть (это вроде получилось), но и хоть как-то поджать данные, ибо места на конечном устройстве мало. Отсюда и неизвестный заранее размер.
Уже выловил кучку ошибок, потом вспомнил, что хотел поставить "use strict" и понеслась новая партия исправлений... потом обнаружил, что 43й ФФ не поддерживает "let" (на одном из объектов приходится сидеть на старом компе с 512МБ ОЗУ)...
По ходу правок уже планирую некоторые моменты переделать с нуля.
Ответить с цитированием
  #10 (permalink)  
Старый 01.08.2019, 11:32
Аватар для SuperZen
Профессор
Отправить личное сообщение для SuperZen Посмотреть профиль Найти все сообщения от SuperZen
 
Регистрация: 08.11.2017
Сообщений: 642

Сообщение от NiOl Посмотреть сообщение
потом обнаружил, что 43й ФФ не поддерживает "let"
...
Run your index.html in various browser such as Chrome,Firefox and Edge Browser, if your getting error message means the browser is not accepting ES6 javascript
So we have to convert our ES6 into ES5 script format.
How ??
We have use babel for converting ES6 to ES5....

взял тут https://medium.com/@zural143/basic-w...l-dc66e72c86c6
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как показать элементы под картой zava75 Элементы интерфейса 3 13.07.2018 18:48
Как преобразовать массив объектов в массив массивов sovsem-nub Events/DOM/Window 4 12.05.2018 21:56
Как вы относитесь к наркоманам? Maxmaxmaximus7 Оффтопик 7 05.02.2014 13:29
Управление скроллом "а-ля тач" HonesT Элементы интерфейса 2 27.08.2013 14:25
Как лучше сделать глобальный массив skyfish AJAX и COMET 4 17.02.2009 18:05