Слишком "большие" массивы.Нужна ли мне база данных?Или есть другие варианты? - PullRequest
0 голосов
/ 18 февраля 2011

Недавно я столкнулся с ошибкой OutOfMemory в программе из-за (я полагаю) чрезмерного использования массивов и двойных многомерных массивов (размер которых составляет около 5000x60 элементов). Поэтому я ищу альтернативу хранению информации.

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

Я не прошу огромных примеров кода, ссылок на хорошие учебники или чтения (книги тоже подойдут, хотя я смогу заказать их в Германии без затрат на доставку в миллиарды долларов ;-)) было бы идеально.

Также: нет, я никогда ничего не делал с базами данных, но я готов чему-нибудь научиться.

Заранее спасибо за любую помощь.

edit: исправлено «двойной массив» в «многомерный массив».

edit2: Я думал, что может быть «универсальное» решение проблемы с огромными массивами, но вы доказали, что я ошибался. Потому что трудно найти альтернативу, если люди не знают, что я делаю, вот краткий обзор того, что я делаю (в основном для статистических целей):

  • Чтение данных из файла CSV, каждая строка напоминает пользовательский объект MyClass1, содержащий около 60 объектов MyClass2.
  • Итерация по всем экземплярам MyClass1, добавление или редактирование свойств каждого из объектов MyClass2, в зависимости от различных условий.

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

edit3: Вопрос: «Вы могли бы обрабатывать каждую строку за раз, или вам сначала нужен контекст всего файла?»

  • Мне нужен контекст всего файла. Так, например, MyClass1 [4000] [0] зависит от данных из MyClass1 [0] [0], MyClass1 [1] [0] и т. Д. Дополнительная информация: чтение файла CSV и создание «пустых» объектов работает нормально. Ошибка появляется позже, когда я перебираю все объекты MyClass1.

Ответы [ 2 ]

2 голосов
/ 18 февраля 2011

РЕДАКТИРОВАТЬ: Хорошо, теперь немного яснее, что вы делаете ... но многомерный массив размером 5000 x 60 - это всего лишь 300 000 элементов. Что такое каждый элемент? Как вы думаете, на самом деле требуется больше данных в памяти за один раз, чем ваша машина может обработать?

Не совсем понятно, что вы делаете - вам определенно нужно все информация в памяти сразу? Возможно, проблема в том, что вы не позволяете массивам собирать мусор, когда вы с ними работаете?

Не зная, какую обработку вы выполняете, трудно понять, подходит ли база данных, но массивы примерно настолько же эффективны, насколько вы, вероятно, получите, если вам действительно нужно значение для каждого элемента. Если бы вы могли справиться с разреженным массивом, это, конечно, другое дело.

0 голосов
/ 18 февраля 2011

Я думаю, что проблема в том, что при использовании больших структур память никогда не очищается, а когда вы передаете такой массив методу, копируется вся память, поэтому OutOfMemoryException - это возможный результат таких больших массивов, читайте это решить проблему

...