¿Cómo puedo hacer que JSL lea archivos binarios más rápido?Un archivo binario tiene datos tabulares.
Tiene 144 bytes por línea,
La primera columna es una marca de tiempo de milisegundos de 8 bytes,
Cada columna subsiguiente se divide en 4 bytes.
La clave es que lo siguiente es solo para extraer los datos de algunas columnas.

Escribí un JSL que puede leer datos, pero es más lento.
Pídale a un experto que le ayude a solucionarlo.
co = 144;
bb = Load Text File( file, blob() );
gs = 9;
m = 0;
g = 1;
k = 1;
ar = [];
ar = J( z, g + gs, . );//20230815
For( k = 1, k <= z, k++,
ff = Blob Peek( bb, (k - 1) * co + 0, 8 );
a = "";
Try( a = Blob To Matrix( ff, "uint", 8, "little", 8 )[1] );
no = Length( Char( a ) );
If( no > 0,
Try(
nn = Format( a / 1000 + Informat( "01/01/1970", "mm/dd/yyyy" ) + In Hours( 8 ), "yyyy-mm-ddThh:mm:ss" );
b = Num( Munger( nn, 12, 2 ) || Munger( nn, 15, 2 ) || Munger( nn, 18, 2 ) );
);
If( 91500 <= b < 92600,
m = m + 1;
ar[m, 1] = Num( Munger( nn, 1, 4 ) || Munger( nn, 6, 2 ) || Munger( nn, 9, 2 ) );
ar[m, 2] = b;
i = 1;
ff = Blob Peek( bb, (k - 1) * co + 64, 4 );
ar[m, g + 2] = Blob To Matrix( ff, "int", 4, "little", 1 )[1] / 1000/*BM1*/;
i = 1;
ff = Blob Peek( bb, (k - 1) * co + 68, 4 );
ar[m, g + 3] = Blob To Matrix( ff, "int", 4, "little", 1 )[1] / 1000/*BM2*/;
i = 1;
ff = Blob Peek( bb, (k - 1) * co + 84, 4 );
ar[m, g + 4] = Blob To Matrix( ff, "int", 4, "little", 1 )[1]/*BL1*/;
i = 1;
ff = Blob Peek( bb, (k - 1) * co + 88, 4 );
ar[m, g + 5] = Blob To Matrix( ff, "int", 4, "little", 1 )[1]/*BL2*/;
i = 1;
ff = Blob Peek( bb, (k - 1) * co + 104, 4 );
ar[m, g + 6] = Blob To Matrix( ff, "int", 4, "little", 1 )[1] / 1000/*MM1*/;
i = 1;
ff = Blob Peek( bb, (k - 1) * co + 108, 4 );
ar[m, g + 7] = Blob To Matrix( ff, "int", 4, "little", 1 )[1] / 1000/*MM2*/;
i = 1;
ff = Blob Peek( bb, (k - 1) * co + 124, 4 );
ar[m, g + 8] = Blob To Matrix( ff, "int", 4, "little", 1 )[1]/*ML1*/;
i = 1;
ff = Blob Peek( bb, (k - 1) * co + 128, 4 );
ar[m, g + 9] = Blob To Matrix( ff, "int", 4, "little", 1 )[1]/*ML2*/;
);
,
Break()
);
);
¡Gracias expertos!
Automatización y scriptingVentanasRe: ¿Cómo puedo hacer que JSL lea archivos binarios más rápido?archivo
Re: ¿Cómo puedo hacer que JSL lea archivos binarios más rápido?¿Qué es más rápido? ¿Qué tan rápido debería ser?
Re: ¿Cómo puedo hacer que JSL lea archivos binarios más rápido?Utilice el generador de perfiles JSL para encontrar los puntos críticos.
El generador de perfiles probablemente mostrará las funciones blobpeek y blobtomatrix en rojo muy brillante. Parece que se las llama millones de veces para blobs de 4 bytes.
En su lugar, prueba lo siguiente: realiza una llamada gigante a blobtomatrix para convertir todo el archivo en números enteros de cuatro bytes. Esto debería llevar solo unos segundos. Utiliza las operaciones matriciales de JMP para extraer los datos que necesitas de ahí. Probablemente puedas hacer toda la conversión sin ningún bucle for.
Si es necesario, puedes crear otra matriz gigante de ints, uints y floats de 4 u 8 bytes. Utiliza únicamente las columnas que tengan los datos binarios correctos. Probablemente combinaría dos ints de 4 bytes para crear el valor de 8 bytes, algo como x[row,1] + ( x[row,2]*(2^32) ). No estudié lo que estabas haciendo con ellos, así que puede que no sea lo que necesitas.
Además: cuando se utiliza blobtomatrix para números enteros de 8 bytes, JMP solo podrá conservar 52 de los 64 bits. Dado que las columnas 6 y 7 son cero y son los bits altos en un número little-endian de 8 bytes, probablemente funcionará bien. (Un número de punto flotante de doble precisión solo tiene 52 bits de fracción).
Re: ¿Cómo puedo hacer que JSL lea archivos binarios más rápido?pa = "I:\E\20250127.dat";bb = Load Text File( pa, blob() );
co = 144;gs = 9;m = 0;g = 1;k = 1;z0 = Length( bb );z = z0 / co;ar = [];ar = J( z, g + gs, . );
For( k = 1, k <= z, k++,
ff = Blob Peek( bb, (k - 1) * co + 0, 8 );
a = Blob To Matrix( ff, "uint", 8, "little", 8 )[1];
nn = Format( a / 1000 + Informat( "01/01/1970", "mm/dd/yyyy" ) + In Hours( 8 ), "yyyy-mm-ddThh:mm:ss" );
b = Num( Munger( nn, 12, 2 ) || Munger( nn, 15, 2 ) || Munger( nn, 18, 2 ) );
m = m + 1;
ar[m, 1] = Num( Munger( nn, 1, 4 ) || Munger( nn, 6, 2 ) || Munger( nn, 9, 2 ) );
ar[m, 2] = b;
ff = Blob Peek( bb, (k - 1) * co + 8, 144 );
br = Blob To Matrix( ff, "uint", 4, "little", 34 )[0, 1 :: 34];
z1 = Length( bb );
z2 = (z1 - 8)</img> / 4;
ar[m, g + 2] = br[1, 15] / 1000;
ar[m, g + 3] = br[1, 16] / 1000;
ar[m, g + 4] = br[1, 20];
ar[m, g + 5] = br[1, 21];
ar[m, g + 6] = br[1, 25] / 1000;
ar[m, g + 7] = br[1, 26] / 1000;
ar[m, g + 8] = br[1, 30];
ar[m, g + 9] = br[1, 31];
);
Re: ¿Cómo puedo hacer que JSL lea archivos binarios más rápido?DE ACUERDO
¡Gracias Craig!

Re: ¿Cómo puedo hacer que JSL lea archivos binarios más rápido?¡Genial! ¡Apuesto a que también fue mucho más rápido! Ni un solo bucle en JSL, todos los bucles son internos en C++, donde es más rápido.
Para cualquiera que esté mirando y preguntándose:
2: lee el archivo completo en un blob.
3: convierte el blob completo en una matriz. En particular, la matriz tiene 36 columnas de los datos binarios originales que tenían 144 bytes por línea; los valores son todos números enteros de 4 bytes. 144/4=36.
4: z parece no usarse; *creo* que pueden ser unos 20 millones.
5-16: crea las columnas de la tabla de datos.
18-19: estas declaraciones de apariencia inocente están tomando altas columnas de datos de la matriz.
20: intenta crear un entero de 64 bits a partir de dos enteros de 32 bits; consulte los comentarios anteriores sobre los 52 bits. Nuevamente, se trata de una columna completa en un solo paso.
21-30: copiar y transformar columnas enteras de la matriz a la tabla.
Esto es bastante bueno porque no hay valores de texto ni de punto flotante en los datos. Los valores de punto flotante se pueden manejar con una segunda matriz de 4 u 8 puntos flotantes. El texto es más difícil, pero aún es posible; hay diferentes opciones según los conjuntos de caracteres Unicode de 7 u 8 bits y la longitud fija o variaciones de las cadenas de longitud variable.
Re: ¿Cómo puedo hacer que JSL lea archivos binarios más rápido?Es mucho más rápido.
Gracias por el consejo del experto.
La marca de tiempo original de 8 bytes se puede convertir de esta manera.