AppEngine: IOError при сохранении большого количества объектов в хранилище данных - PullRequest
2 голосов
/ 16 ноября 2010

ура всем.Я использую Ubuntu 10.04 и последнюю версию Google AppEngine SDK.Я работаю над простым сайтом, на котором есть посты и комментарии к постам.Я в основном реализовал простое дерево для хранения моих комментариев со значениями parent_comment, left и right.

Я создал событие, которое запускается до того, как новый (not is_saved()) комментарий будет put()в хранилище данных Google, которое вычисляет значения left и right для нового комментария, а также обновляет старые комментарии для действительной иерархии.Я в основном следовал Управление иерархическими данными в MySQL и реализовал его в Python.

Кажется, все работает нормально, добавляются новые комментарии, потоки выглядят хорошо, но ...
циклкоторый отправляет 40 комментариев во время запуска, но когда я увеличиваю этот цикл до 80 или более, у меня остается IOError:

IOError: [Errno 24] Too many open files: '/tmp/tmp0agXqU'

Мой код для генерации 60 комментариев выглядит следующим образом:

for k in range(0, 4):
    comments = {0: None}
    for i in range(1, 21):
        j = random.randrange(0, len(comments))
        pc = comments[j]

        comments[i] = Comment(
            name=lipsum(count=1),
            email=lipsum(count=1, make_slug=True) + '@email.com',
            url='http://' + lipsum(count=2, make_slug=True) + '.com',
            content=lipsum(count=random.randrange(10, 50)),
            object_link=p.key(),
            parent_comment=pc
        )
        comments[i].put()

Функция lipsum просто возвращает фрагмент текста lorem ipsum.

Есть идеи, как решить эту проблему?Спасибо!

Ответы [ 2 ]

2 голосов
/ 16 ноября 2010

У меня была такая же проблема для массивного рабочего.

Переключение на SQLite для локального хранилища данных может решить проблему:

dev_appserver.py --use_sqlite 

Начиная с App Engine SDK 1.3.3, Python SDK имеет новую экспериментальную функцию, которая дает возможность использовать SQLite в качестве бэкэнда заготовки хранилища данных.Использование SQLite в dev_appserver должно ускорить производительность вашего локального хранилища данных при тестировании больших наборов данных.

Для документации dev_appserver посмотрите здесь

1 голос
/ 16 ноября 2010

Скорее всего, это связано с ошибкой в последней версии App Engine SDK .Комментарии к сообщению об ошибке содержат исправление, устраняющее проблему.

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