OutOfMemoryException - стратегии для преодоления этой проблемы? - PullRequest
0 голосов
/ 07 августа 2011

Прежде всего, я знаю, что этот вопрос много раз обсуждался на этом форуме, например Большой массив C # OutOfMemoryException и OutOfMemoryException

ОбъектУ меня проблема с

Dictionary<long, Double> results

, который хранит идентификатор в длинном и результат вычисления в Double

Мне придется повторно использовать один и тот же объект около 10 ~ 20 раз, каждый раз, когда я использую повторноэто я назову

results = new Dictionary<long, Double>

Я знаю, что могу записать его в текстовый файл или файл базы данных для дальнейшей обработки, но, если это возможно, я постараюсь избежать этого, поскольку он слишком медленный для количестваданные я обрабатываю.Я также попробовал GC.Collect (), но не повезло с этим.

Может ли кто-нибудь с некоторым предыдущим опытом дать указатель на это?

Редактировать: у меня> 3 миллиона объектов в списке, но они фиксированы (т. Е. Ключ один и тот же во всех итерациях)

Ответы [ 3 ]

1 голос
/ 07 августа 2011

, если проблема просто в том, что память не освобождается должным образом; возможно, если вы используете «.Clear ()» в словаре, а не заново создаете каждый раз?

1 голос
/ 07 августа 2011

Ах - нет.Также не имеет смысла выходить из памяти исключений в ваших вызовах.

Я настоятельно рекомендую вам серьезно заняться анализом - поместите в программу профилировщик памяти и найдите реальную проблему.длинная / двойная комбинация не имеет смысла, если только вы не храните несколько сотен миллионов пар, и даже тогда ....

И: Мое до 64 бит всегда разумно.Ограничение в 2/3 ГБ на процесс является более сложным для .net из-за «накладных расходов» GC - невозможно использовать всю память.64 бит имеет гораздо более высокие пределы.

Но опять же, ваша индикация неверна.Новый словарь, скорее всего, НЕ является ошибкой, что-то еще тратит вашу память.

0 голосов
/ 07 августа 2011

Вместо того, чтобы создавать 20 разных экземпляров, используйте один, но очистите список (который позволяет GC собирать старые элементы), чтобы у вас было больше памяти для работы.Кроме того, целесообразно перейти на 64-разрядную среду, если вам требуется огромное количество памяти.

...