LZMA c ++ проблема со сжатием больших файлов - PullRequest
1 голос
/ 23 октября 2019

Поэтому, пытаясь сжать файл размером 22 ГБ, все работает с файлами <2 ~ gb. Я получаю сообщение об ошибке: SZ_ERRROR_FAIL. </p>

Через несколько точек прерывания я получаю это от LzmaEnc.c: 2946, потому что 'p-> nowPos64 'показывает значение 4294958849

Что я знаю, это максимальное значение 32-разрядного целого числа без знака. Я собираю в x64, чтобы плечи были проблемой.

Использование LZMA 1.9

Что-то подсказывает мне, где-то во всем этом используется uint32. Это я должен найти и заменить на uint64.

Реализация от 7Z SDK

Пример реализации:

int res = SZ_OK;
res = LzmaEncode(
        (unsigned char*)&outBuf[LZMA_PROPS_SIZE + sizeof(DATASIZE)], &destLen,
        (unsigned char*)&inBuf[0], inBuf.size(),
        &props, 
        (unsigned char*)&outBuf[0], &propsSize,
        props.writeEndMark,
        &g_ProgressCallback, &SzAllocForLzma, &SzAllocForLzma);
}

Iv добавил новое определениепосле прочтения после просмотра более исходного кода. _LZMA_SYSTEM_SIZE_T; Кажется, он ничего не делает.

Есть ли #define, которого мне не хватает, чтобы заставить LZMA работать правильно? В лучшем случае документация скудная.

1 Ответ

0 голосов
/ 03 ноября 2019

Обычный LMZA от 7z импл. НЕ поддерживает файлы> 4 ГБ. Необходимо использовать LMZA2.

...