Come si può far sì che JSL legga più velocemente i file binari?Un file binario ha dati tabellari.
Ha 144 byte per riga,
La prima colonna è un timestamp di 8 byte in millisecondi,
Ogni colonna successiva è divisa in 4 byte.
La cosa importante è che quanto segue serve solo ad estrarre i dati di alcune colonne.

Ho scritto un JSL in grado di leggere i dati, ma è più lento.
Chiedi a un esperto di aiutarti a risolvere il problema.
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()
);
);
Grazie Esperti!
Automazione e scriptingFinestreR: Come posso far sì che JSL legga più velocemente i file binari?file
R: Come posso far sì che JSL legga più velocemente i file binari?Cosa è più veloce? Quanto dovrebbe essere veloce?
R: Come posso far sì che JSL legga più velocemente i file binari?Utilizzare il profiler JSL per individuare gli hotspot.
Il profiler mostrerà probabilmente le funzioni blobpeek e blobtomatrix in un rosso molto acceso. Sembra che siano chiamate milioni di volte per i blob da 4 byte.
Prova invece questo: fai una gigantesca chiamata blobtomatrix per convertire l'intero file in interi da quattro byte. Dovrebbero volerci solo pochi secondi. Usa le operazioni di matrice di JMP per prendere i dati che ti servono da lì. Probabilmente puoi fare l'intera conversione senza alcun ciclo for.
Se necessario, puoi creare un'altra matrice gigante di int, uint e float da 4 o 8 byte. Usa solo le colonne che hanno i dati binari corretti. Probabilmente combinerei solo due int da 4 byte per creare il valore da 8 byte, qualcosa come x[row,1] + ( x[row,2]*(2^32) ). Non ho studiato cosa ci facevi, quindi potrebbe non essere ciò di cui hai bisogno.
Inoltre: quando si usa blobtomatrix per interi da 8 byte, JMP sarà in grado di mantenere solo 52 dei 64 bit. Poiché le colonne 6 e 7 sono zero e sono i bit alti in un numero little-endian da 8 byte, probabilmente funzionerà bene. (Un numero in virgola mobile a doppia precisione ha solo 52 bit di frazione.)
R: Come posso far sì che JSL legga più velocemente i file binari?Grazie Craig!
Poiché i dati all'inizio del file sono incompleti, ho preso il contenuto dell'ultima riga
Questo codice viene utilizzato per due divisioni e due blob in Matrix
Credo di sì.


R: Come posso far sì che JSL legga più velocemente i file binari?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];
);
R: Come posso far sì che JSL legga più velocemente i file binari?OK
Grazie Craig!

R: Come posso far sì che JSL legga più velocemente i file binari?Bello! Scommetto che era anche molto più veloce! Non un singolo loop in JSL, tutti i loop sono interni in C++ dove è veloce.
Per chiunque stia cercando e si stia chiedendo:
2: legge l'intero file in un blob.
3: converte l'intero blob in una matrice. In particolare, la matrice ha 36 colonne dai dati binari originali che avevano 144 byte per riga; i valori sono tutti interi a 4 byte. 144/4=36.
4: z sembra inutilizzato; *penso* che possano essere circa 20 milioni.
5-16: crea le colonne della tabella dati.
18-19: queste affermazioni dall'aspetto innocente stanno prendendo alte colonne di dati dalla matrice.
20: tenta di creare un intero a 64 bit da due interi a 32 bit, vedere i commenti precedenti sui 52 bit. Di nuovo, questa è un'intera colonna in un unico passaggio.
21-30: copiare e trasformare intere colonne dalla matrice alla tabella.
Questo è piuttosto interessante perché non ci sono valori in virgola mobile o di testo nei dati. I float potrebbero essere gestiti con una seconda matrice di float 4 o 8. Il testo è più difficile ma è comunque possibile; diverse scelte a seconda dei set di caratteri Unicode a 7 bit, 8 bit e lunghezza fissa o variazioni di stringhe di lunghezza variabile.
R: Come posso far sì che JSL legga più velocemente i file binari?È molto più veloce.
Grazie per il consiglio dell'esperto.
Il timestamp originale di 8 byte può essere convertito in questo modo.