Как найти размер экземпляров db.Model в GAE Python перед вызовом db.put ()? - PullRequest
1 голос
/ 27 февраля 2011

Я пишу оптимизатор для своего приложения, поэтому db.put () вызывается настолько редко, насколько это возможно. Я застрял со следующей проблемой:

У меня есть ряд классов, полученных из db.Model. Экземпляры этих классов хранятся в списке:

class DBPutter:
    data = [] # list of instances
    def add(self, model):
        # HERE I WANT TO CHECK THAT self.data IS NOT EXEEDING 1MB
        self.data.append(model)
        if len(self.data) == 1000:
            self.flush()  # actual call to db.put() using deferred

При таком подходе я получаю множество RequestTooLargeError исключений. Как проверить, что мои данные не превышают 1 МБ?

Ответы [ 3 ]

4 голосов
/ 27 февраля 2011

Pympler имеет метод asizeof и должен работать в Python 2.5: http://code.google.com/p/pympler/

Я думаю, вы слишком оптимистичны. Если экземпляр закрывается до того, как в вашем паттере окажется 1000 объектов, вы можете потерять данные. Кроме того, я думаю, что использование отложенной библиотеки с большим объемом данных приведет как минимум к двум db.puts. Один, когда задание отправлено (потому что полезная нагрузка превышает 10k), и один внутри задачи, на самом деле пишущий ваши модели.

3 голосов
/ 28 февраля 2011

В соответствии с примечаниями к выпуску 1.4.0:

  • Ограничения размера и количества для операций получения / установки / удаления партии хранилища данных были удалены.Размер отдельных сущностей по-прежнему ограничен 1 МБ, но ваше приложение может объединять столько сущностей для вызовов get / put / delete, сколько допустимо для общего срока хранения данных.бессмысленно: полезные нагрузки в очереди задач ограничены 10k, и если ваша отложенная полезная нагрузка больше этого, она создаст сущность хранилища данных для хранения полезной нагрузки. В результате она все равно выполняет операцию хранилища данных, так что вы можете такжеЭто все сами.

    Однако, если вы храните тысячи объектов, вам почти наверняка захочется выполнять весь процесс в очереди задач, а не в интерактивном запросе.

1 голос
/ 27 февраля 2011

Я не работаю с GAE, но вы можете попробовать вызвать sys.getsizeof для каждой из ваших моделей и убедиться, что сумма составляет менее 1 МБ.рецепт для альтернативы sys.getsizeof, которая должна работать в Python 2.5.

...