Wie kann JSL Binärdateien schneller lesen?Eine Binärdatei hat tabellarische Daten.
Es hat 144 Bytes pro Zeile,
Die erste Spalte ist ein 8-Byte-Zeitstempel im Millisekundenbereich.
Jede nachfolgende Spalte wird in 4 Bytes aufgeteilt.
Der Schlüssel besteht darin, dass im Folgenden nur die Daten einiger Spalten extrahiert werden.

Ich habe ein JSL geschrieben, das Daten lesen kann, aber es ist langsamer.
Bitten Sie einen Experten um Hilfe bei der Behebung des Problems.
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()
);
);
Danke, Experten!
Automatisierung und SkriptingWindowsBetreff: Wie kann JSL Binärdateien schneller lesen?Datei
Betreff: Wie kann JSL Binärdateien schneller lesen?Was ist schneller? Wie schnell sollte es sein?
Betreff: Wie kann JSL Binärdateien schneller lesen?Verwenden Sie den JSL-Profiler, um die Hotspots zu finden.
Der Profiler zeigt die Funktionen Blobpeek und Blobtomatrix wahrscheinlich in sehr leuchtendem Rot an. Es sieht so aus, als würden sie für 4-Byte-Blobs millionenfach aufgerufen.
Versuchen Sie stattdessen Folgendes: Führen Sie einen riesigen Blobtomatrix-Aufruf aus, um die gesamte Datei in Vier-Byte-Ganzzahlen umzuwandeln. Das sollte nur ein paar Sekunden dauern. Verwenden Sie die Matrixoperationen von JMP, um daraus die benötigten Daten zu entnehmen. Sie können die gesamte Konvertierung wahrscheinlich ohne For-Schleifen durchführen.
Bei Bedarf können Sie eine weitere riesige Matrix aus 4- oder 8-Byte-Ints, Uints und Floats erstellen. Verwenden Sie nur die Spalten, die die richtigen Binärdaten enthalten. Ich würde wahrscheinlich einfach zwei 4-Byte-Ints kombinieren, um den 8-Byte-Wert zu erhalten, etwa x[row,1] + ( x[row,2]*(2^32) ). Ich habe nicht studiert, was Sie damit gemacht haben, also ist das vielleicht nicht das, was Sie brauchen.
Außerdem: Wenn Sie Blobtomatrix für 8-Byte-Ganzzahlen verwenden, kann JMP nur 52 der 64 Bits behalten. Da die Spalten 6 und 7 Nullen sind und die höchsten Bits in einer 8-Byte-Little-Endian-Zahl sind, wird es wahrscheinlich gut funktionieren. (Eine Gleitkommazahl mit doppelter Genauigkeit hat nur 52 Bruchbits.)
Betreff: Wie kann JSL Binärdateien schneller lesen?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];
);
Betreff: Wie kann JSL Binärdateien schneller lesen?OK
Danke, Craig!

Betreff: Wie kann JSL Binärdateien schneller lesen?Toll! Ich wette, es war auch viel schneller! Keine einzige Schleife in JSL, alle Schleifen sind intern in C++, wo sie schnell sind.
Für alle, die auf der Suche sind und sich fragen:
2: liest die gesamte Datei in einen Blob.
3: konvertiert den gesamten Blob in eine Matrix. Insbesondere hat die Matrix 36 Spalten aus den ursprünglichen Binärdaten, die 144 Bytes pro Zeile hatten; die Werte sind alle 4-Byte-Ganzzahlen. 144/4=36.
4: z scheint unbenutzt zu sein; ich *denke*, es könnten ~20 Millionen sein.
5-16: erstellt die Datentabellenspalten.
18–19: Diese unschuldig aussehenden Aussagen greifen große Datenspalten aus der Matrix auf.
20: Versuche, aus zwei 32-Bit-Ganzzahlen eine 64-Bit-Ganzzahl zu machen, siehe vorherige Kommentare zu 52 Bit. Auch hier handelt es sich um eine ganze Spalte in einem Schritt.
21-30: Ganze Spalten aus der Matrix kopieren und in die Tabelle transformieren.
Das ist ziemlich cool, weil die Daten weder Gleitkomma- noch Textwerte enthalten. Gleitkommazahlen könnten mit einer zweiten Matrix mit Gleitkommazahlen 4 oder 8 verarbeitet werden. Text ist schwieriger, aber immer noch möglich; unterschiedliche Auswahlmöglichkeiten abhängig von 7-Bit-, 8-Bit-, Unicode-Zeichensätzen und Zeichenfolgen mit fester Länge oder Variationen von Zeichenfolgen mit variabler Länge.
Betreff: Wie kann JSL Binärdateien schneller lesen?Es ist viel schneller.
Danke für den Expertenrat.
Der ursprüngliche 8-Byte-Zeitstempel kann auf diese Weise konvertiert werden.