Bulat_Ziganshin
Silver Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору в общем, алгоритм вырисовывается такой: 1. берём объём своб. вирт. памяти - это необходимо чтобы не получать сообщения "Слишком мало виртуальной памяти" 2. танцуя от этого значения вниз, находим наибольший непрерывный блок памяти 3. используем min(объём физ. памяти, размер наиб. непр. блока) как базу для -lc. плюс добавляем ограничение -ld=1gb. поскольку по умолчанию -lc75%, то при упаковке используется максимум 3/4 от размера этого блока (или физ. ОЗУ) эти ограничения используются при отсуствии lc/ld и обеспечивают 1) невылет порграммы из-за нехватки памяти при упаковке 2) возможность распаковать данные на любом компе где стоит достаточно памяти при использовании же -lc- -ld- эти ограничители отключаются и ответственность за работоспособность алгоритмов и возможность распаковки ложится целиком на пользователя для обычных же юзеров в худшем случае ("Allocated 1326 mb") это означает сжатие с 64 мб словарём в lzma. конечно, это далеко не идеал (реально в этом случае можно использовать словарь в 128 мб), но для начала это терпимо. в идеале конечно надо 1) возвращать для алгоритма список размеров блоков памяти, которые ему потребуются 2) в каждом алгоритме выделять память в порядке уменьшения размеров блоков 3) для алгоритмов типа ppmd выделять память небольшими блоками, скажем по 1 мб но это всё слишком сложно. пусть по умолчанию работает хотя бы надёжно, а при отключении проверок главное - чтобы была возможность использовать память как можно эффектвиней соответственно, в режимах m8/m9 в настройках будет заказываться до 2-3гб озу, но реально эти заказы будут обрезаться если только не указано -lc- -ld- Цитата: то как быть при распаковке. представь себе, что ты посылаешь свой архив какому-нибудь японцу? да он же харакири себе сделает! Тоже самое будет и сейчас. Даже с тем же 7-zip-пом 64bit, тоже самое будет при использовании PPMD и большой размер модели 2Гб, не распакуется на 32bit системе, т.к. не сможет выделить столько памяти, с 1.5Гб будут проблему, и автор скорее всего это знает - выбора 2Гб нету. | разница в том, что если данные упакованы со словарём в 1 гиг, то понятно что делать для их распаковки - поставить как минимум 1.5гб или найти кого-то с такой памятью. дальше же уже начинается шаманство - нужно деинсталировать иероглифы, сунуть /3g в boot.ini или поставить 64-битную систему. поэтому архивы, созданные обычным пользователм, без копания в настройках, должны распаковываться в 1гб памяти. с ручными же настройками это уже находится на совести того, кто упаковал да, кстати, какой максимум словаря в lzma получается выставить (на vista с editbin) ? имхо, 255 мб должно работать? в rep/ppmd, как я понимаю, 2047 мег без проблем? Добавлено: Цитата: А при выборе в какой непрерывный блок памяти писать данные случаем не выбирается самый большой, даже для небольших данных? | а фиг его знает. попробуй проверить сам - сопоставить макс. размер своб. блока и макс. размер словаря для каждого алгоритма Добавлено: сунул этот код внутрь fa, порверил с использованием wininet и без оного: Test memory allocation using VirtualAlloc::MEM_RESERVE Allocated 1447 mb Allocated 329 mb Allocated 72 mb Allocated 72 mb Allocated 34 mb Allocated 13 mb Test memory allocation using VirtualAlloc::MEM_RESERVE Allocated 1779 mb Allocated 72 mb Allocated 72 mb Allocated 45 mb Allocated 13 mb размер наиб. свободного блока в тончости соответствует макс. словарю, с которым может работать ppmd |