2012-03-12 3 views
1

Можно создать дубликат:
How to refer to children in a tree with millions of nodesисключение памяти в C#

Я пытаюсь реализовать дерево, которое будет содержать миллионы узлов, которые, в свою очередь, может иметь неопределенное количество детей узлы.

Для этого (поскольку каждый узел может иметь более одного дочернего узла), я храню дочерние узлы в структуре данных словаря. В результате этого, когда каждый объект узла создается (из миллионов), у меня есть объект-узел, который содержит значение символа, хранящееся в соответствующем узле, а также отдельную структуру словаря, которая содержит ссылку на дочерние узлы ,

Мое дерево работает на несколько тысяч узлов, однако, когда оно достигает миллионов узлов, возникает исключение из памяти. Это связано с тем, что каждый из миллионов узлов, работающих в памяти, также имеет свой собственный словарь? т.е. у меня есть миллионы объектов?

Мне нужно, чтобы эти объекты работали в памяти и не могли использовать файлы или базы данных. Может ли кто-нибудь предложить решение?

+3

, что бы вы сделали? это читаемо? почему вы не можете использовать файлы или db? –

+0

Вы можете изменить свой словарь на массив для одного. – mydogisbox

+3

Можете ли вы показать нам структуру вашего класса Node? – Tudor

ответ

1

Вы можете попробовать использовать Windows с 64 битами и скомпилировать программу на 64 бита. Это даст вам гораздо больше памяти ... Это не волшебная пуля (есть еще ограничения на то, насколько большой может быть структура памяти)

+1

@KeithS Я очень рад, что вы так думаете, но на самом деле все совсем по-другому. Один объект OBJECT ограничен 2 ГБ (поэтому причина BigArray, предложенная Дор Коэном) – xanatos

+0

KeithS: Я считаю, что это неверно: http://stackoverflow.com/questions/982051/net-max-memory-use-2gb-even -дль-x64-сборка – thecoop

1

Вы можете прочитать о Memory Limits для выпусков Windows.

http://msdn.microsoft.com/en-us/library/aa366778(v=vs.85).aspx

Подумайте об использовании 64-битной ..

Взгляните на этот вопрос: Is there a memory limit for a single .NET process

Для вашего сценария попробуйте использовать BigArray

http://blogs.msdn.com/b/joshwil/archive/2005/08/10/450202.aspx

1

Решение не будет упрощено у.

Варианты:

  1. Разгрузка некоторые из этих узлов на диск, где у вас есть большее количество «рабочее пространство», чтобы иметь дело с. Только загружайте в память то, что действительно действительно должно быть там. Из-за радикальной разницы между дисковыми и RAM-скоростями это может привести к огромному снижению производительности.

  2. Увеличьте объем оперативной памяти в машине, чтобы разместить то, что вы делаете. Это может потребовать перехода на 64 бит (если в настоящее время это 32-разрядное приложение). В зависимости от ваших реальных требований к памяти это может быть довольно дорого. Конечно, если у вас есть 32-битное приложение, и у вас будет достаточно ОЗУ, переключение на 64 бит по крайней мере приведет вас к диапазону 3 ... 4 ... гораздо меньший размер. Другими словами, вам нужно все, что предлагает Словарь, или вы можете сделать только с помощью структуры, определяющей левую и правую ссылки на другие узлы? В принципе, взгляните на то, как вам нужно обработать это и посмотреть на традиционные способы работы с древовидными структурами данных.

2

Ваше исключение OOM может быть вызвано фрагментацией LOH, а не фактическим исчерпанием памяти. Вы можете попробовать переключиться на SortedDictionary, в котором используется красно-черное дерево, а не словарь, в котором используется хэш-таблица, и посмотрите, улучшает ли это ситуацию. Или вы можете реализовать свою собственную древовидную структуру.

0

Другое решение, которое я могу предложить, если ваше единственное ограничение не является доступом к файлу (если вы против какой-либо базы данных, этот ответ спорный) - это использовать базу данных в памяти (например, SQlite) или что-то еще что обеспечивает аналогичную функциональность. Это поможет вам во многих отношениях, не в последнюю очередь из-за того, что база данных будет выполнять управление памятью для вас, и есть много проверенных алгоритмов для хранения больших деревьев в базах данных, которые вы можете адаптировать.

Надеюсь, это поможет!