#javascript #python #string #binary #half-precision-float
#javascript #python #строка #двоичный #половинная точность -с плавающей точкой
Вопрос:
У меня есть таблица, которую я пытаюсь прочитать в Javascript, с данными, которые достаточно велики, чтобы я хотел иметь их в двоичном формате для экономии места. Большая часть таблицы состоит либо из чисел, либо из перечислений, но есть некоторые данные, которые представляют собой строки. Я пытаюсь найти наилучший способ чтения этих данных в Javascript. Есть какие-нибудь предложения?
К вашему сведению, заархивированная текстовая версия составляет ~ 33 МБ, в то время как размер заархивированного двоичного файла составляет ~ 20 МБ, поэтому я пытаюсь уменьшить размер, надеюсь, это позволит ему загружаться быстрее. Я планирую выполнить некоторую предварительную обработку данных с помощью Python, что сведет данные только к тем, которые меня действительно волнуют. Возможно, я выполняю некоторую фильтрацию этих данных, но в идеале мне в конечном итоге нужен статический веб-сайт, поэтому я бы настоятельно предпочел не полагаться на какой-либо код на стороне сервера. Файл, в котором есть почти все, что примечательно, составляет всего ~ 1 МБ, так что, я надеюсь, это не большая проблема.
Бонусные баллы, если какая-либо система допускает 16-битное значение с плавающей запятой, поскольку существует ряд значений с плавающей запятой, для которых 16 бит более чем достаточная точность для адекватного захвата.
Мой код, каким бы простым он ни был на данный момент, выглядит следующим образом. Обратите внимание на отсутствующий блок, где происходит что-нибудь полезное…
function loadBinaryFloatArray(url) {
var mRequest = new XMLHttpRequest();
mRequest.open('GET', url);
mRequest.responseType = 'arraybuffer';
mRequest.onreadystatechange = function () {
if (this.readyState === 4) {
}
};
mRequest.send();
}
console.log("Test")
loadBinaryFloatArray("/data/sbdb_important.bin")
Данные выглядят примерно так. Возможно, я удалю некоторые из этих столбцов, но это исходные данные. Из некоторой ссылки только первый столбец фактически будет сохранен в виде строки, остальные могут быть сохранены в виде чисел некоторого вида или перечислений, преобразованных в число. Вероятно, будет две фактические строки, я думаю, я собираюсь разделить одну строку на две части.
Для справки, код Python для упаковки выглядит следующим образом. Я могу изменить e
s на что-то другое, если требуется, либо на float32s, либо на целое число, которое преобразуется в десятичное число, но было бы неплохо поддерживать изначально.
struct.pack('ehifeefff',diameter,type,epoch,a,e,i,om,w,ma)
Комментарии:
1. Javascript изначально не имеет 16-битных чисел с плавающей запятой. Это означает, что его придется обрабатывать сложным способом.
2. Можете ли вы предоставить образец данных? Может быть, дюжина строк или около того.
3. @Ouroborus включил снимок первой дюжины строк. Не могу просто легко опубликовать данные, я могу разобраться, если это полезно.
Ответ №1:
Такого рода проблемы обычно требуют индивидуальных решений, и требуется много настроек. Но, как правило, я думаю, что это может быть так:
Разделите данные на типы столбцов. Извлекайте данные с помощью отдельных, по типу, но одновременных запросов. Столбцы string будут просто массивом JSON массивов строк, сжатие http позаботится о минимизации размера загрузки. Значения с плавающей запятой и целые числа могут быть отправлены в виде двоичных массивов соответствующего типа (см. Типизированные массивы Javascript). Перечисления могут быть строками (сжатие http может ускорить загрузку) или целыми числами плюс сопоставление, тестирование покажет, что обычно быстрее.
В браузере рекомбинируйте данные. Таблица кажется большой, поэтому вам, вероятно, понадобится библиотека подкачки таблиц для обработки представления. В противном случае используйте эффективные стратегии для вставки большого количества элементов. Обычно это происходит путем создания большого массива текстовых фрагментов, представляющих конечный HTML-код, .join('')
редактирования его, а затем одновременного ввода всего этого в документ.
Комментарии:
1. К сожалению, разделение их на отдельные файлы может быть именно тем, что требуется. Возможно, это просто способ справиться с этим, подожду, услышу ли я что-нибудь получше, прежде чем двигаться дальше. Спасибо!