[.Net] Коллекция для хранения больших объемов данных
От: 80LevelElf http://80levelelf.com
Дата: 01.07.14 19:52
Оценка:
Здравствуйте, какое-то время назад написал свой контейнер, специально приспособленный для хранения больших объемов данных, для которых List и LinkedList будут работать крайне неэффективно. Например при вставке в середину List'a с 10к элементов нам придется сдвинуть "вправо" 5к элементов, если вообще не случиться переполнения(если capacity == 10к) и не придется выделять новую память. Старался соблюсти разумный компромисс между скоростью и требованию к памяти.

Единственный найденный мною аналог — библиотека PowerCollections(а именно элемент BigList) от дяди Рихтера(вернее его компании) не понравилась ввиду сильного проседания во многих местах. Например, заполнение коллекции из 10^5 с середины:


for(int i=0;i<10000;i++)
{
   collection.Insert(collection.Count/2, i);
}

у меня происходит за 120 мсек, у дяди Рихтера за 15 сек.
Или следующий код в массиве из 10^4 элементов:

for (int i = 0; i < 10000; i++)
{
   collection.IndexOf(i);
}

у меня выполняется за 60 мсек, у дяди Рихтера за 2 сек.
Конечно, далеко не везде удалось достичь таких результатов, но вроде бы удалось достичь того, чтобы нигде не было таких сильных мест проседания(насколько это возможно).
Если вы думаете, что это за счет оперативной памяти, то процесс с коллекцией из 10 миллионов(10^7) int'ов, заполненных в цикле с помощью Add() у ДР берет 67.1 мб, а у меня 48.7

Не хотелось бы сейчас все обрисовать куда лучше, чем есть на самом деле, поэтому если интересно сама библиотека здесь, в виде dll занимает всего около 30 кб.

К тому же если есть знающие люди, они наверняка найдут множество мест, где моя библиотека проигрывает ДР, да и не стоит забывать про качество нового проекта любителя и вылизанного годами проекта самого ДР.

P.S> изначально расположил пост тут: http://www.rsdn.ru/forum/src/ , но вскоре увидел, что эта ветка форума практически мертва, поэтому извините за такой косяк и если можно удалите её оттуда.
net коллекция
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.