Использование памяти с Django + SQLite3 - PullRequest
3 голосов
/ 10 марта 2010

У меня есть очень большая таблица SQLite с более чем 500 000 строк и примерно 15 столбцами (в основном, с плавающей точкой). Я хочу перенести данные из БД SQLite в приложение Django (которое может быть поддержано многими RDBM, но Postgres в моем случае). Все работает хорошо, но по мере того как итерация продолжается, использование памяти для процесса Python увеличивается на 2-3 Мб в секунду. Я попытался с помощью 'del' удалить объекты EVEMapDenormalize и row в конце каждой итерации, но раздувание продолжается. Вот выдержка, есть идеи?

class Importer_mapDenormalize(SQLImporter):
def run_importer(self, conn):
    c = conn.cursor()

    for row in c.execute('select * from mapDenormalize'):
        mapdenorm, created = EVEMapDenormalize.objects.get_or_create(id=row['itemID'])
        mapdenorm.x = row['x']
        mapdenorm.y = row['y']
        mapdenorm.z = row['z']

        if row['typeID']:
            mapdenorm.type = EVEInventoryType.objects.get(id=row['typeID'])

        if row['groupID']:
            mapdenorm.group = EVEInventoryGroup.objects.get(id=row['groupID'])

        if row['solarSystemID']:
            mapdenorm.solar_system = EVESolarSystem.objects.get(id=row['solarSystemID'])

        if row['constellationID']:
            mapdenorm.constellation = EVEConstellation.objects.get(id=row['constellationID'])

        if row['regionID']:
            mapdenorm.region = EVERegion.objects.get(id=row['regionID'])

        mapdenorm.save()
    c.close()

Меня совсем не интересует обёртывание этой БД SQLite с помощью Django ORM. Мне бы очень хотелось выяснить, как передавать данные, не занимая всю мою оперативную память.

Ответы [ 2 ]

3 голосов
/ 10 марта 2010

Глупый я, это было решено в Django FAQ .

Необходимо очистить кеш запросов БД в режиме отладки.

from django import db 
db.reset_queries()
1 голос
/ 10 марта 2010

Я думаю, select * from mapDenormalize и загрузка результата в память всегда будут плохой идеей. Мой совет - разложите скрипт на куски. Используйте LIMIT для получения данных порциями.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...