如何讓JSL更快讀取二進位檔案?二進位檔案具有表格資料。
每行有 144 個字節,
第一列是 8 位元組的毫秒時間戳,
隨後的每個欄位均以 4 個位元組分割。
關鍵是下面只是提取部分列的資料。

我寫了一個JSL,可以讀數據,但比較慢。
請專家幫忙解決。
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()
);
);
感謝專家!
自動化和腳本編寫視窗Re: 如何讓JSL更快讀取二進位檔案?文件
Re: 如何讓JSL更快讀取二進位檔案?什麼更快?應該要多快?
Re: 如何讓JSL更快讀取二進位檔案?使用 JSL 分析器尋找熱點。
探查器可能會將 blobpeek 和 blobtomatrix 函數顯示為非常亮的紅色。看起來對於 4 位元組 blob,它們被呼叫了數百萬次。
請嘗試以下操作:進行一次巨大的 blobtomatrix 調用,將整個檔案轉換為四位元組整數。那應該只有幾秒鐘。使用 JMP 的矩陣運算從中取得所需的資料。
如果需要,您可以建立另一個由 4 或 8 位元組 int、uint、float 組成的巨型矩陣。僅使用具有正確二進位資料的列。我可能只是組合兩個 4 個位元組整數來產生 8 個位元組值,例如 x[row,1] + ( x[row,2]*(2^32) )。我沒有研究你對它們做了什麼,所以這可能不是你需要的。
另外:當您對 8 位元組整數使用 blobtomatrix 時,JMP 將只能保留 64 位元中的 52 位元。由於第 6 列和第 7 列為零,並且是 8 位元組小端數中的高位,因此它可能會正常工作。 (雙精度浮點數只有 52 位元小數。)
Re: 如何讓JSL更快讀取二進位檔案?謝謝克雷格!
因為檔案開頭的資料不完整,所以我取了最後一行的內容
此代碼用於兩個分割和兩個斑點到矩陣
大概吧。


Re: 如何讓JSL更快讀取二進位檔案?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];
);
回覆:如何讓 JSL 更快讀取二進位檔案?好的
謝謝你,克雷格!

回覆:如何讓 JSL 更快讀取二進位檔案?好的!我敢打賭它也快得多! JSL 中沒有單一循環,所有循環都在 C++ 內部,因此速度很快。
對於那些正在觀看並想知道的人:
2:將整個檔案讀入一個blob。
3:將整個blob轉換成矩陣。具體來說,該矩陣有 36 列,原始二進位資料每行有 144 個位元組;這些值都是 4 位元組整數。 144/4=36。
4:z 似乎未被使用;我「認為」可能是約2000萬。
5-16:製作資料表列。
18-19:這些看似無害的語句正在從矩陣中抓取高列資料。
20:嘗試從兩個 32 位元整數建立一個 64 位元整數,請參閱先前有關 52 位元的評論。再次強調,這是一步完成的整個專欄。
21-30:將矩陣中的整列複製並轉換到表中。
這非常酷,因為數據中沒有浮點或文字值。浮點數可以用第二個 4 或 8 浮點數矩陣來處理。根據 7 位元、8 位元、Unicode 字元集和固定長度或可變長度字串的變化做出不同的選擇。
回覆:如何讓 JSL 更快讀取二進位檔案?它更快了。
謝謝專家的建議。
原來的8位元組時間戳記可以這樣轉換。