Передача 8 МБ двойного массива в JavaScript - PullRequest
1 голос
/ 20 июня 2011

У меня есть двойная матрица 1024x1024 (т.е. массив 8 Мб), которую мне нужно использовать в приложении javascript.

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

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

Для протокола, это нудистский ndarray, поэтому я могу довольно легко поиграть с форматом из Python.

Спасибо.

Редактировать: Прямо сейчас я выгружаю свой необработанный массив в виде строки и анализирую его с помощью Binary Parser от JSFromHell , но это действительно, довольно медленно ...

Ответы [ 3 ]

2 голосов
/ 24 июня 2011

Лучшим способом был бы XMLHttpRequest с поддержкой двоичного кода, см. https://developer.mozilla.org/En/Using_XMLHttpRequest#Receiving_binary_data_using_JavaScript_typed_arrays.. Вы можете загрузить данные непосредственно в Float64Array, и это будет очень быстро. Недостаток: спецификация не была завершена до недавнего времени (как вы можете видеть, Firefox 4/5 реализует один подход, в то время как Firefox 6 будет использовать другой), и пока он реализован только в Firefox и Chrome (Chrome работает так же, как Firefox 6). Поэтому, если производительность действительно важна, вы можете использовать этот подход, когда это возможно (XMLHttpRequest имеет свойство responseType или mozResponseArrayBuffer), и в противном случае использовать медленный код. Есть надежда, что большинство людей скоро обновят свои браузеры и пойдут по быстрому маршруту.

2 голосов
/ 23 июня 2011

Как насчет json со сжатием, используя mod_gzip или его эквивалент?Пусть браузер распакует его.

1 голос
/ 24 июня 2011

Распечатайте его как простой JSON, то есть массив JS:

[[1,2,3],
 [4,5,6],
 [7,8,9]]

Если вы печатаете это внутри тега <script>, вы можете просто передать его в переменную:

var matrix = [...];

Если он загружен через AJAX, пропустите его через eval():

var matrix = eval( '(' + xhr.responseText + ')' );

Я думаю, что ничто не преобразует строку в массив быстрее, чем JS-браузер браузера.

...