Andy Melnikov (nponeccop) wrote,
Andy Melnikov
nponeccop

Category:

Недостатки VirtualFree() в Win32

У меня есть класс СLazyBuffer. Он резервирует большой кусок адресного пространства (типичные значения - от 100 мб до 10 гигабайт, у меня х64), а затем в методе Write(const void* dataToWrite, const size_t size) выделяет в нем страницы по мере необходимости, экономя, таким образом, виртуальную память. Затем буфер сбрасывается (отправляется по сети, пишется в файл - в данном контексте это не важно) и выделенные страницы возвращаются системе.

Сегодня мне приспичило загрузить из большого CSV-файла только вторую колонку. Я читаю файл построчно, паршу вторую колонку и отправляю в CLazyBuffer. Однако, в данном сценарии использования мне уже не нужно циклическое выделение-удаление страниц, и я решил дописать метод ReleaseUnused(), который бы освобождал неиспользуемую часть адресного пространства. Конечно, два в шестьдесят четвертой - это прилично, но как показал опыт сначала 640кб, потом 2гб - рано или поздно и этот лимит исчерпается.

Но оказалось, что (выделение жирным - мое):

MEM_RELEASE
0x8000

Releases the specified region of pages. After this operation, the pages are in the free state.

If you specify this value, dwSize must be 0 (zero), and lpAddress must point to the base address returned by the VirtualAlloc function when the region is reserved. The function fails if either of these conditions is not met.

То есть, освободить можно только весь блок адресов целиком! Интересно, FreeBSD или Linux позволяют освобождать часть выделенного блока адресного пространства?
Subscribe

  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 2 comments