Tengo una tabla que estoy tratando de leer en Javascript, con datos que son lo suficientemente grandes como para tenerlos en formato binario para ahorrar espacio. La mayor parte de la tabla son números o enumeraciones, pero hay algunos datos que son cadenas. Estoy tratando de descubrir la mejor manera de leer esos datos en Javascript. ¿Alguna sugerencia?
FYI, la versión de texto comprimida es de ~33 MB, mientras que la multa binaria comprimida es de ~20 MB, por lo que estoy tratando de reducir el tamaño, con suerte permitiendo que se cargue más rápido. Estoy planeando hacer un preprocesamiento de los datos con Python, lo que reducirá los datos a lo que realmente me importa. Es posible que esté filtrando algunos de estos datos, pero idealmente, en última instancia, me gustaría un sitio web estático, por lo que preferiría no tener que depender de ningún tipo de código del lado del servidor. El archivo que tiene casi cualquier cosa importante es solo ~ 1 MB, por lo que espero que no sea una gran preocupación.
Puntos de bonificación si cualquier sistema permite un flotante de 16 bits, ya que hay un número de flotantes que 16 bits es más que suficiente precisión para capturar adecuadamente.
Mi código, tan simple como es hasta ahora, es el siguiente. Tenga en cuenta el bloque que falta donde sucede cualquier cosa útil ...
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")Los datos se parecen a esto. Tenga en cuenta que probablemente eliminaré algunas de estas columnas, pero estos son los datos de origen. De alguna referencia, solo la primera columna en realidad se almacenará como una cadena, las otras se pueden almacenar como números de algún tipo o enumeraciones convertidas en un número. Probablemente habrá dos cadenas reales, creo que voy a dividir una cadena en sus dos partes.
Como referencia, el código de Python para empaquetar es el siguiente. Puedo cambiar el e s a otra cosa si es necesario, ya sea float32s o un número entero que se convierte en un decimal, pero sería bueno admitirlo de forma nativa.
struct.pack('ehifeefff',diameter,type,epoch,a,e,i,om,w,ma)Este tipo de problemas generalmente necesitan soluciones a medida y hay muchos ajustes involucrados. Pero, en general, creo que podría ser así:
Divida los datos en tipos de columna. Recupere los datos a través de solicitudes separadas, por tipo, pero simultáneas. Las columnas de cadena serían solo una matriz JSON de matrices de cadenas, la compresión http se encargará de minimizar el tamaño de descarga. Los números flotantes e enteros se pueden enviar como matrices binarias del tipo apropiado (ver matrices con tipo Javascript ). Las enumeraciones pueden ser cadenas (la compresión http podría hacer que esta sea la descarga más rápida) o ints-plus-mapping, las pruebas dirían cuál es generalmente más rápido.
En el navegador, recombina los datos. La tabla parece grande, por lo que probablemente querrá una biblioteca de paginación de tablas para manejar la presentación. De lo contrario, utilice estrategias eficientes para insertar una gran cantidad de elementos. Esto suele ser mediante la creación de una gran variedad de fragmentos de texto que representan el html final, .join('') ing y luego inyectarlo todo a la vez en el documento.