Мне нужно оптимизировать фактическую загрузку / разбор CSV-файла (строки). Лучший способ, которым я знаю, - это алгоритмы загрузки на месте, и я успешно использовал их, используя JNI и DLL C ++, которая загружает данные непосредственно из файла, созданного из проанализированных данных CSV.
Было бы хорошо, если бы он остановился на этом, но использование этой схемы только сделало это на 15% быстрее (больше не нужно разбирать данные). Одна из причин того, что это не так быстро, как я думал, заключается в том, что java-клиент использует jstring, поэтому мне нужно снова преобразовать фактические данные из char * в jstring.
Лучше всего было бы игнорировать этот шаг преобразования и загружать данные непосредственно в объекты jstring (больше не нужно преобразовывать). Таким образом, вместо дублирования данных, основанных на загруженных на месте данных, jstring будет указывать прямо на кусок памяти (обратите внимание, что данные будут состоять из jchars, а не chars). Очень плохо то, что нам нужно убедиться, что сборщик мусора не собирает эти данные (сохраняя ссылку на них, может быть?), Но это должно быть выполнимо ... нет?
Я думаю, у меня есть два варианта:
1- Загрузите данные в java (не более jni) и используйте символы, указывающие на загруженные данные, для создания строк ... но мне нужно найти способ предотвратить дублирование данных при создании строки.
2- Продолжайте использовать jni для «ручного» создания и установки переменной jstring и убедитесь, что параметры сборщика мусора установлены правильно, чтобы он ничего не делал с ним. Например:
jstring str;
str.data = loadedinplacedata; // assign data pointer
return str;
Не уверен, что это возможно, но я не возражаю, просто сохраните jstring непосредственно в файл и перезагрузите его так:
jstring * str = (jstring *)&loadedinplacedata[someoffset];
return * str;
Я знаю, что это не обычная вещь Java, но я почти уверен, что Java достаточно расширяема, чтобы это можно было сделать. И дело не в том, что у меня действительно есть выбор ... проекту уже 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;
Примечание. Приведенный выше код ускорил его на 20% (вместо 15) благодаря использованию данных Unicode вместо UTF8 (NewString вместо NewStringUTF). Это показывает, что если я смогу убрать этот шаг или оптимизировать его, я получу неплохое увеличение производительности.