Проблемы с памятью: я должен писать в файл / базу данных, если я использую swap? (Python) - PullRequest
2 голосов
/ 21 июня 2010

Я создаю и обрабатываю очень большой набор данных, содержащий около 34 миллионов точек данных, и в настоящее время храню их в словарях python в памяти (около 22 500 словарей, по 15 словарей в каждом из 1588 экземпляров классов).Хотя я могу управлять всем этим в памяти, я использую всю свою оперативную память и большую часть своей подкачки.

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

Ответы [ 3 ]

1 голос
/ 21 июня 2010

Получите реляционную базу данных, быстро! Или намного больше оперативной памяти.

Если вы используете Python, начните с Программирование базы данных Python . SQLite был бы выбором, но я бы предложил MySQL в зависимости от количества данных, с которыми вы имеете дело. Если вам нужен объектно-ориентированный подход к хранению ваших данных, вы, возможно, захотите взглянуть на SQLAlchemy , но вы, вероятно, получите большую эффективность, если в конечном итоге сами сопоставите каждый из ваших классов объектов с таблицей и просто справляюсь со строками и столбцами.

1 голос
/ 22 июня 2010

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

Вам просто нужно вытащить данные из пары «ключ-значение» из памяти, а не изменить ее формат.Вы должны посмотреть на хранилища ключевых значений, такие как BDB , Волдеморт , MongoDB или Scalaris (просто назвать несколько - некоторые другиевовлеченный и функциональный, чем другие, но все должны легко обрабатывать ваш набор данных), или для набора данных, который, по вашему мнению, может стать еще больше или сложнее, вы можете посмотреть на такие системы, как Cassandra , Riak или CouchDB (среди прочих).ВСЕ эти системы предложат вам значительно более высокую производительность по сравнению с реляционной базой данных и будут более точно сопоставлены с моделью данных в памяти.

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

(Возможно также, что просто маршалинг / выборка ваших данных в сегментах и ​​управление ими самостоятельно обеспечит более высокую производительность, чем реляционная база данных, если предположить, что ваш шаблон доступа сделал подкачку / вывод довольно редким событием. Это длинный путь, ноесли вы просто храните старые данные, и никто на самом деле не смотрит на них, вы можете просто выбросить их на диск.)

1 голос
/ 21 июня 2010

Поскольку вы будете рассматривать «отдельные части», ваше приложение сможет лучше использовать ядро, чем виртуальная память.ВМ удобна, но - по определению - немного глупа в отношении мест ссылки.

Использование базы данных.

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

...