понедельник, 19 сентября 2011 г.

Утечка памяти в BlockingCollection

В .NET 4.0 появился класс BlockingCollection. С его помошью, к примеру, очень элегантно реализуется паттерн Producer-consumer.

Однако, как оказывается, в нем есть утечка памяти....

В тикете описан workaround, с реализацией обвертки над объектом, который использоется в коллекции, и последующим сбросом поля содержащего ссылку на реальный объект в null.
Как я понимаю это решает проблему только частично, так как в таком случае очишается ссылка на реальный объект, но ссылка на обвертку остается.

С помощью данного класса я в многопоточном режиме парсил csv файлы объемом в несколько гигабайт, с последующей записью в БД. Два дня убил на дебаг... После реализации workaround'a, у меня получилось загрузить файл объемом в 1GB, но на 13GB, я снова поймал Out of memory:(

Комментариев нет: