Эффективное сжатие кеша mmap'd - PullRequest
0 голосов
/ 10 сентября 2018

Привет, есть фрагмент кода, использующий mmap() в GNU / Linux, написанный на C / C ++, который записывает массивы данных в предварительно выделенный mmap. Я не уверен, что использую правильные термины. Это массивы переменного размера, и я использую объединение, чтобы каждый элемент данных подходил независимо от базового типа. Каждый массив данных хранит смещение (в другом месте, не относящееся к делу), которое можно использовать для доступа к началу данных, длина массива также сохраняется там.

Когда каждый массив данных добавляется в кэш, поддерживаемый mmap, он добавляется в конечной позиции последнего записанного массива. Это все отлично работает. При удалении или переназначении элемента я просто аннулирую его в «указателе», в котором хранится смещение и длина mmap, и записываю еще один новый элемент в кэш.

Поскольку элементы изменяются или удаляются, кэш постоянно растет. Вот мой вопрос, как лучше всего сжать эти недействительные и устаревшие массивы в C или C ++? (Я имею в виду C, так как он работает с необработанными байтами.) Пожалуйста, я прошу только предложения о том, как удалять и сжимать данные, когда массив становится недействительным, чтобы избежать фрагментации или расточительности. Я ищу наиболее эффективный способ.

Также обратите внимание, что для этого требуется GCC 4.4.7, поэтому я могу использовать только C99 и C ++ 98.

Небольшой пример кода для того, что я делаю, чтобы дать вам представление о том, как добавляются данные:

// Get the offset position in mmap for writing
void *vPtr = reinterpret_cast<void*>(CardCache + getCardCacheFixedDataSize() + offset);
ElementList list;
memcpy(vPtr, &list, sizeof(ElementList));

ElementList *dataPtr = reinterpret_cast<ElementList*>(vPtr);
ElementData *data = reinterpret_cast<ElementData*>(malloc(count*sizeof(ElementData)));
dataPtr->count = (size_t)count;

for (i = 0; i < count; ++i) {
    data[i].i = intList[i];
}
memcpy(&dataPtr->data, &data[0], count*sizeof(ElementData));
free(data);

// "point" to the data
currPtr->key = key;
currPtr->offset = offset;

// advance the writing offset to the next position.
cardCacheVarWriteOffset += reqsize;
...