문제

나는 장치에 저장할 많은 양의 데이터(1MB 정도이지만 가변적임)가 있는 J2ME 응용 프로그램을 개발 중입니다.파일 시스템에 의존할 수 없어서 여러 개의 레코드 저장소를 허용하지만 각각의 크기가 제한되어 있는 레코드 관리 시스템(RMS)에 갇혀 있습니다.내 초기 대상 플랫폼인 Blackberry는 각각 64KB로 제한됩니다.

RMS에 많은 양의 데이터를 저장하는 문제를 다른 사람이 해결해야 했는지, 그리고 이를 어떻게 관리했는지 궁금합니다.레코드 크기를 계산하고 하나의 데이터 세트가 너무 크면 여러 저장소에 걸쳐 분할해야 한다고 생각하고 있지만 그대로 유지하려면 복잡성이 많이 추가됩니다.

저장되는 데이터 유형은 매우 다양하지만 특히 한 세트만 64KB 제한을 초과합니다.

도움이 되었습니까?

해결책

몇 킬로바이트를 초과하는 경우에는 JSR 75 또는 원격 서버를 사용해야 합니다.RMS 레코드는 일부 고급형 휴대폰에서도 크기와 속도가 극도로 제한되어 있습니다.J2ME에서 1MB의 데이터를 처리해야 하는 경우 신뢰할 수 있고 이식 가능한 유일한 방법은 해당 데이터를 네트워크에 저장하는 것입니다.HttpConnection 클래스와 GET 및 POST 메서드는 항상 지원됩니다.

JSR 75 FileConnection을 지원하는 핸드셋에서는 유효한 대안일 수 있지만 코드 서명이 없으면 사용자 경험은 악몽이 됩니다.거의 모든 단일 API 호출은 포괄적인 권한 선택 없이 보안 프롬프트를 호출합니다.JSR 75를 사용하여 앱을 배포하는 회사는 일반적으로 가능한 인증서의 작은 부분을 처리하기 위해 모든 포트에 6개의 바이너리가 필요합니다.이는 제조업체 인증서에만 적용됩니다.일부 휴대폰에는 이동통신사 잠금 인증서만 있습니다.

다른 팁

RMS 성능 및 구현은 장치마다 크게 다르므로 플랫폼 이식성이 문제인 경우 코드가 일부 장치에서는 잘 작동하고 다른 장치에서는 작동하지 않을 수도 있습니다.RMS는 대용량이 아닌 소량의 데이터(고득점 테이블 등)를 저장하도록 설계되었습니다.

여러 레코드 저장소에 파일을 저장하면 일부 플랫폼이 더 빠르다는 것을 알 수 있습니다.일부는 한 매장 내에서 여러 레코드를 사용하면 더 빠릅니다.대부분은 저장에는 문제가 없지만 저장소에서 대량의 데이터를 삭제하면 사용할 수 없을 정도로 느려집니다.

가장 좋은 방법은 가능한 경우 JSR-75를 대신 사용하고 더 나은 지원이 없으면 RMS로 대체되는 자체 파일 저장소 인터페이스를 만드는 것입니다.

불행하게도 JavaME의 경우 장치별 코드 변형을 작성하는 경우가 많습니다.

가장 유연한 접근 방식은 RMS 위에 자체 파일 시스템을 구현하는 것입니다.하드 드라이브의 블록과 유사한 방식으로 RMS 레코드를 처리하고 아이노드 구조 또는 여러 블록에 논리 파일을 분산시키는 것과 유사합니다.블록 위에 바이트 또는 스트림 지향 인터페이스를 구현한 다음 그 위에 특수 데이터 구조를 작성하기 위한 또 다른 API 레이어를 만드는 것이 좋습니다(또는 단순히 개체를 데이터 스트림에 직렬화할 수 있도록 설정).

운영 체제에 관한 Tanenbaum의 고전 책 간단한 파일 시스템을 구현하는 방법을 다루고 있지만 종이 문서가 마음에 들지 않으면 온라인에서 다른 리소스를 찾을 수 있다고 확신합니다.

Blackberry OS 4.6에서는 RMS 저장소 크기 제한이 512Kb로 늘어났지만 많은 장치가 4.6을 지원하지 않을 가능성이 높기 때문에 이는 큰 도움이 되지 않습니다.Blackberry의 다른 옵션은 레코드 크기 제한이 64kb이지만 저장소 크기에는 제한이 없는 영구 저장소입니다(장치의 물리적 제한 제외).

카를로스와 izb가 맞는 것 같아요.

매우 간단합니다. JSR75(FileConnection)를 사용하고 유효한(신뢰할 수 있는) 인증서로 midlet에 서명하는 것을 기억하세요.

읽기 전용의 경우 리소스 파일을 인덱싱하여 허용 가능한 시간(10초 이내)에 도달합니다.2개의 ~800KB CSV 가격표 내보내기가 있습니다.프로그램 클래스와 두 파일 모두 300KB JAR로 압축됩니다.

검색할 때 다음을 표시합니다. List 그리고 두 개를 실행 Thread채우기 위해 백그라운드에 있기 때문에 첫 번째 결과는 꽤 빨리 나타나고 즉시 볼 수 있습니다.먼저 간단한 선형 검색을 구현했지만 너무 느렸습니다(~2분).

그런 다음 알파벳순으로 정렬된 파일을 색인화하여 각 문자의 시작 부분을 찾았습니다.이제 한 줄씩 분석하기 전에 먼저 InputStreamReader.skip() 첫 글자를 기준으로 원하는 위치로 이동합니다.지연은 대부분 리소스 압축 해제로 인해 발생하는 것으로 생각되므로 리소스를 분할하면 속도가 더욱 빨라질 것입니다.나는 쉬운 업그레이드의 이점을 잃지 않기 위해 그렇게 하고 싶지 않습니다.CSV는 전처리 없이 내보내집니다.

저는 이제 막 JavaME용 코딩을 시작했지만 모든 데이터 청크의 크기가 제한되어 레코드 인덱스와 오프셋을 사용하는 데이터 구조 설계가 필요한 이전 버전의 PalmOS에 대한 경험이 있습니다.

유용한 의견을 보내주신 모든 분들께 감사드립니다.결국 가장 간단한 해결책은 저장되는 데이터의 양을 제한하고, 저장소 규모에 따라 데이터를 조정하는 코드를 구현하고, 로컬에 저장되지 않은 경우 요청 시 서버에서 데이터를 가져오는 것이었습니다.OS 4.6에서 제한이 증가했다는 점은 흥미롭습니다. 운이 좋으면 내 코드가 자체적으로 조정되어 더 많은 데이터를 저장할 것입니다. :)

.cod 컴파일러를 사용하지 않고 Blackberry용 J2ME 애플리케이션을 개발하면 아카이브에 서명할 수 없기 때문에 JSR 75 사용이 일부 제한됩니다.Carlos가 지적했듯이 이것은 모든 플랫폼에서 발생하는 문제이며 PIM 부분을 사용하여 비슷한 문제가 있었습니다.RMS는 Blackberry 플랫폼에서 엄청나게 느린 것으로 보이므로 데이터가 메모리에 캐시되고 우선 순위가 낮은 백그라운드 스레드에서 RMS에 기록되지 않는 한 상단의 inode/b-트리 파일 시스템이 얼마나 유용한지 잘 모르겠습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top