バイナリ ファイルには表形式のデータが含まれています。
1行あたり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()
);
);
専門家の皆さん、ありがとう!
何がより速いのでしょうか? どのくらいの速さであるべきでしょうか?
JSL プロファイラーを使用してホットスポットを見つけます。
プロファイラーはおそらく blobpeek 関数と blobtomatrix 関数を非常に明るい赤色で表示します。4 バイトの BLOB に対してこれらの関数が何百万回も呼び出されているように見えます。
代わりに、これを試してください。1 回の巨大な blobtomatrix 呼び出しで、ファイル全体を 4 バイトの整数に変換します。これは数秒で完了します。JMP の行列演算を使用して、そこから必要なデータを取得します。おそらく、for ループを使用せずに変換全体を実行できます。
必要であれば、4 バイトまたは 8 バイトの int、uint、float の別の巨大なマトリックスを作成できます。正しいバイナリ データを持つ列のみを使用します。おそらく、2 つの 4 バイト int を結合して、x[row,1] + (x[row,2]*(2^32)) のような 8 バイト値を作成します。あなたがそれらを使って何をしていたかは調べていないので、それが必要なことではないかもしれません。
また、8 バイトの整数に blobtomatrix を使用する場合、JMP は 64 ビットのうち 52 ビットしか保持できません。列 6 と 7 はゼロで、8 バイトのリトルエンディアン数の上位ビットであるため、おそらく問題なく動作します。(倍精度浮動小数点数には 52 ビットの小数部しかありません。)
素晴らしい! かなり速くなったと思います! JSL にはループが 1 つもありません。ループはすべて C++ の内部で行われるため、高速です。
探している方、疑問に思っている方へ:
2: ファイル全体を BLOB に読み込みます。
3: ブロブ全体をマトリックスに変換します。特に、マトリックスには、1 行あたり 144 バイトの元のバイナリ データから 36 列が含まれ、値はすべて 4 バイトの整数です。144/4=36。
4: z は未使用のようです。約 2,000 万個であると思われます。
5-16: データ テーブルの列を作成します。
18-19: これらの一見無害なステートメントは、マトリックスから大量のデータを取得しています。
20: 2 つの 32 ビット整数から 64 ビット整数を作成しようとします。52 ビットに関する以前のコメントを参照してください。これも、1 つのステップで 1 つの列全体になります。
21-30: マトリックスから列全体をコピーしてテーブルに変換します。
これは、データに浮動小数点値やテキスト値がないため、非常に便利です。浮動小数点は、浮動小数点 4 または 8 の 2 番目のマトリックスで処理できます。テキストはより困難ですが、それでも可能です。7 ビット、8 ビット、Unicode 文字セット、および固定長または可変長文字列のバリエーションに応じて、さまざまな選択肢があります。
はるかに高速です。
専門家のアドバイスに感謝します。
元の 8 バイトのタイムスタンプは次のように変換できます。