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 호출을 한 번 해서 전체 파일을 4바이트 정수로 변환합니다. 몇 초면 됩니다. JMP의 행렬 연산을 사용해서 필요한 데이터를 가져옵니다. for-loop 없이도 전체 변환을 할 수 있을 겁니다.
필요하다면 4바이트 또는 8바이트 int, uint, float의 또 다른 거대한 행렬을 만들 수 있습니다. 올바른 이진 데이터가 있는 열만 사용하세요. 아마 8바이트 값을 만들기 위해 두 개의 4바이트 int를 결합할 겁니다. x[row,1] + ( x[row,2]*(2^32) 와 비슷할 겁니다. 저는 당신이 그것들로 무엇을 하는지 공부하지 않았기 때문에, 그것이 당신에게 필요한 것이 아닐 수도 있습니다.
또한: 8바이트 정수에 blobtomatrix를 사용하면 JMP는 64비트 중 52비트만 유지할 수 있습니다. 6열과 7열은 0이고 8바이트 리틀 엔디언 숫자의 상위 비트이므로 아마도 잘 작동할 것입니다. (배정밀도 부동 소수점 숫자는 소수점 52비트만 있습니다.)
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];
);
Re: JSL이 바이너리 파일을 더 빨리 읽을 수 있게 하려면 어떻게 해야 하나요?좋아요
고맙습니다, 크레이그!

Re: JSL이 바이너리 파일을 더 빨리 읽을 수 있게 하려면 어떻게 해야 하나요?좋아요! 훨씬 더 빨랐을 거라고 확신해요! JSL에는 루프가 하나도 없고, 모든 루프는 C++ 내부에서 빠른 편이에요.
찾고 궁금해하는 모든 분들을 위해:
2: 전체 파일을 blob으로 읽습니다.
3: 전체 블롭을 행렬로 변환합니다. 특히 행렬에는 줄당 144바이트인 원래 바이너리 데이터의 36개 열이 있습니다. 값은 모두 4바이트 정수입니다. 144/4=36.
4: z는 사용되지 않는 것으로 보입니다. 제 생각에는 ~2천만 정도일 겁니다.
5-16: 데이터 테이블의 열을 만듭니다.
18-19: 이런 해롭지 않아 보이는 진술들은 행렬에서 긴 데이터 열을 잡아당깁니다.
20: 두 개의 32비트 정수에서 64비트 정수를 만들려고 시도합니다. 52비트에 대한 이전 주석을 참조하세요. 다시 말하지만, 이것은 한 단계로 전체 열입니다.
21-30: 행렬의 전체 열을 복사하여 표로 변환합니다.
데이터에 부동 소수점이나 텍스트 값이 없기 때문에 꽤 멋지다. 부동 소수점은 부동 소수점 4 또는 8의 두 번째 행렬로 처리할 수 있다. 텍스트는 더 어렵지만 여전히 가능하다. 7비트, 8비트, 유니코드 문자 집합 및 고정 길이 또는 가변 길이 문자열의 변형에 따라 다른 선택이 가능하다.
Re: JSL이 바이너리 파일을 더 빨리 읽을 수 있게 하려면 어떻게 해야 하나요?훨씬 더 빠르죠.
전문가의 조언에 감사드립니다.
원래 8바이트 타임스탬프는 다음과 같이 변환될 수 있습니다.