Проблемы с памятью: должен ли я писать в файл / базу данных, если я использую swap? (Питон)
Я создаю и обрабатываю очень большой набор данных, содержащий около 34 миллионов точек данных, и в настоящее время я храню их в словарях python в памяти (около 22 500 словарей, по 15 словарей в каждом из 1588 экземпляров класса). Хотя я могу управлять всем этим в памяти, я использую всю мою оперативную память и большую часть моего свопа.
Мне нужно иметь возможность сначала генерировать все эти данные, а затем выполнять анализ по отдельным их частям одновременно. Будет ли это выгодно с с точки зрения эффективности записать часть этих данных в файл или сохранить в базе данных? Или мне лучше просто взять удар на эффективность, которая приходит с использованием моего пространства подкачки. Если я должен писать в файл / базу данных, есть ли какие-либо инструменты python, которые вы рекомендовали бы сделать это?
3 ответов:
Получить реляционную базу данных, быстро! Или намного больше оперативной памяти.
Если вы используете Python, то начните с Python Database Programming . SQLite был бы выбор, но я бы предложилMySQL , основанный на количестве данных, с которыми вы имеете дело. Если вы хотите объектно-ориентированный подход к хранению данных, вы можете посмотреть на SQLAlchemy , но вы, вероятно, получите большую эффективность, если вы в конечном итоге сопоставите каждый из ваших классов объектов с таблицей самостоятельно и просто справляюсь со строками и столбцами.
Поскольку вы будете смотреть на "выделенные части", ваше приложение сможет лучше использовать ядро, чем виртуальную память. VM удобна, но - по определению - немного глупа в отношении локальности ссылки.
Используйте базу данных.
Я бы, вероятно, начал с модуля sqlite3 на основе простоты, Если или пока я не найду, что это bottlenck.
Если у вас уже есть эти данные в структурах данных Python, предполагая, что вы не делаете много индексирования в памяти (больше, чем очевидный индекс ключей словаря), вы действительно не хотите использовать реляционную базу данных-вы заплатите значительный штраф за производительность без особой выгоды.
Вам просто нужно получить ваши уже данные пары ключ-значение из памяти, а не изменять их формат. Вы должны заглянуть в хранилища значений ключей, такие как BDB, Волдеморт, MongoDB , или Scalaris (просто назовите несколько - некоторые более сложные и функциональные, чем другие, но все они должны легко обрабатывать ваш набор данных), или для набора данных, который, как вы думаете, может стать еще больше или сложнее, вы можете посмотреть на такие системы, как Cassandra, Riak , илиCouchDB (среди других). Все эти системы обеспечат вам значительно более высокую производительность по сравнению с реляционной базой данных и более прямое сопоставление с моделью данных в памяти.
Все сказанное, конечно, если ваш набор данных действительно может быть более производительным, используя преимущества реляционной базы данных (сложные отношения, несколько представлений и т. д.), то идите на это, но вы не должны использовать реляционную базу данных, если все, что вы пытаетесь сделать, это получить ваши структуры данных из памяти.
(также возможно, что просто маршалинг / маринование ваших данных в сегментах и управление ими самостоятельно обеспечит лучшую производительность, чем реляционная база данных, если предположить, что ваш шаблон доступа сделал подкачку в / из относительно нечастые события. Это рискованно, но если вы просто держите старые данные, и никто не смотрит на них, вы можете просто выбросить их на диск самостоятельно.)
Comments