Я ищу библиотеку Chilkat Zip для выгрузки двоичных данных на диск для последующего повторного использования.Капли, которые я хочу выбросить, могут быть очень большими (10+ ГиБ), поэтому копирование любого из них будет пустой тратой времени и пространства.
Я уже нашел метод CkByteData::borrowData
, который позволяет мне разрешить Chilkatиспользуйте буферы, выделенные приложением, вместо того, чтобы копировать его во внутренний буфер.Однако при добавлении этого CkByteData
к CkZipEntry
(используя CkZipEntry::AppendData
) я замечаю, что мое приложение внезапно потребляет вдвое больше памяти;явный признак того, что Чилкат все-таки выполнил копию.После CkZip::WriteZip
потребление памяти возвращается к нормальному.
Фрагмент, который я использовал для тестирования:
int main(int, char**)
{
CkZip zip;
zip.UnlockComponent(/* hidden */);
zip.NewZip("data.zip");
constexpr auto size = 20'000'000; // ~= 20 MiB
auto data = new char[size];
for (auto i = 0; i < size; ++i)
data[i] = static_cast<char>(i);
CkByteData bd;
bd.borrowData(data, size);
auto entry = zip.AppendNew("blob");
entry->AppendData(bd);
// --> Memory consumption jumps to ~40 MiB
delete entry;
zip.WriteZip();
// --> Memory consumption drops to ~20 MiB
delete[] data;
return 0;
}
Мои вопросы:
- Есть ли способ избежать копий моих больших двоичных объектов при записи их в Zip-файл с использованием Chilkat?
- Кроме того,
CkByteData::borrowData
работает только для ввода данных Chilkat не позволит Chilkat выводить данные обратно в приложение.Таким образом, даже если все копии удаляются при записи, можно ли также избегать копий при чтении данных из файла? - Если копии неизбежны, существуют ли масштабируемые обходные пути, которые ограничивают скопированные байты частью данных (например, многократно добавляют часть большого двоичного объекта в Zip и записывают это в файл)?
Примечание: на самом деле я делаюне нужно сжимать данные (но это хороший плюс).Поэтому, если для решения необходимо отключить сжатие, это нормально.