CSV 파일 (문자열)의 실제로드/구문 분석을 최적화해야합니다. 내가 아는 가장 좋은 방법은 load-in-place 알고리즘이며, JNI와 파싱 된 csv 데이터로 만들어진 파일에서 직접 데이터를로드하는 C++ dll을 사용하여 성공적으로 사용했다.자바 문자열 최적화 - 현장 배치 알고리즘
거기서 멈췄다면 좋겠지 만 그 계획을 사용하면 데이터를 더 이상 파싱하지 않아도 15 % 빨라졌습니다. 첫 번째 이유는 Java 클라이언트가 jstring을 사용하므로 char *에서 jstring으로 실제 데이터를 다시 변환해야하기 때문입니다.
변환 단계를 무시하고 데이터를 jstring 객체에 직접로드 (더 이상 변환하지 않음)하는 것이 가장 좋습니다. 따라서 장소에로드 된 데이터를 기반으로 데이터를 복제하는 대신 jstring은 메모리 덩어리를 직접 가리킬 수 있습니다 (데이터는 char 대신 jchars로 작성됩니다). 진짜 나쁜 점은 가비지 컬렉터가 데이터를 수집하지 않도록해야한다는 것입니다 (아마도 참조를 유지함으로써)?하지만 실행 가능해야합니다. 아니요? ..
1로드 자바의 데이터 (더 이상 JNI) 및 문자열을 생성하기 위해로드 된 데이터를 가리키는 문자를 사용하지만 필요 :
나는 내가 그 작업을 수행하는 두 가지 옵션이 생각 String을 만들 때 데이터 복제를 막는 방법을 찾으십시오.
2 jni를 계속 사용하여 "수동으로"jstring 변수를 만들고 설정하고 가비지 수집기 옵션이 올바르게 설정되어 있는지 확인하십시오. 예를 들어 :
이이jstring * str = (jstring *)&loadedinplacedata[someoffset];
return * str;
내가 알고 있어요 아니라고 : 그것이 가능하지만 그냥 마음을 파일에 직접 jstring으로 저장하고 그렇게 다시로드하지 않는다면
jstring str;
str.data = loadedinplacedata; // assign data pointer
return str;
확실하지 않음 일반적인 자바 일이지만, 자바가 충분히 확장 가능하다는 것을 확신 할 수 있습니다. 그리고 나는이 문제에 대한 선택권이 정말로있는 것 같지 않습니다 ... 프로젝트는 이미 3 세이며 일해야합니다. = S 이것은 JNI 코드 (C++)되어
:
const jchar * data = GetData(id, row, col); // get pointer of the string ends w/ \0
unsigned int len = wcslen((wchar_t*)data);
// The best would be to prevent this function to duplicate the data.
jstring str = env->NewString(data, len);
return str;
참고 : 위의 코드 대신 UTF8 유니 코드 데이터를 이용하여 (대신 15)는 20 % 더 빠르게 이루어 (대신 해 NewStingUTF의 newstring 인수로 쓰여진) . 이것은 해당 단계를 제거하거나 최적화 할 수 있다면 성능이 상당히 좋아질 수 있음을 보여줍니다.
이 로딩이란 무엇입니까? 복사가 디스크 IO보다 오래 걸리면 놀랄 것입니다. 실제로 바보 같은 일이 없다고 가정하면됩니다. –
- 1) 전체 파일을 동시에 메모리에 저장해야합니까? - 2) JNI를 사용하는 이유는 무엇입니까? – claymore1977
일반적으로 dev 환경에서는 .jar 파일과 파일에서 직접로드됩니다. 따라서 이미로드되어 있어야하므로 디스크 IO가 거의 없다고 가정 할 수 있습니다. 동시에 메모리에 모두 필요하지 않지만 jar 파일의 일부이므로 파일이 이미 있어야합니다. JNI는 포인터를 사용할 수있게합니다 ...하지만 C++로 더 많은 XP가 있기 때문에 Java의 기능 중 일부를 잘못 이해했을 수도 있습니다. 데이터의 복사를 막을 수있는 방법이 있습니까 (예 : 메모리상의 위치를 기반으로 참조를 다시 사용하는 것과 같은)? – MasterPlanMan