Разбор частей большого XML-файла в App Engine с помощью Blobstore? - PullRequest
2 голосов
/ 24 декабря 2010

Я работаю над приложением Google App Engine, которое будет иметь дело с некоторыми большими (<100 МБ) XML-файлами, загруженными из формы, которая превысит пределы GAE - либо загрузка файла займет более 30 секунд, или превышение размера запроса в 10 МБ. </p>

Текущее решение, которое я представляю, - это загрузить файл в хранилище блогов, а затем перенести его в приложение (по 1 МБ за раз) для анализа. Это также вполне может превысить 30-секундный лимит для запроса, поэтому мне интересно, есть ли хороший способ для обработки больших XML-документов в виде кусков, поскольку мне может понадобиться сделать это через очереди задач за 30-секундные пакеты. 1003 *

В настоящее время я использую BeautifulSoup для других частей проекта, переключившись с минидома. Есть ли способ обработки данных в блоках, который бы хорошо работал с GAE?

Ответы [ 4 ]

2 голосов
/ 24 декабря 2010

30-секундное ограничение применяется ко времени выполнения вашего кода, и ваш код не начинает выполняться до тех пор, пока не будет получен весь пользовательский запрос - поэтому время, которое пользователь тратит на загрузку файла, не имеет значения.

Тем не менее, использование blobstore звучит как лучшая идея. Вы можете использовать BlobReader , который эмулирует файл с доступом к хранилищу BLOB-объектов, для обработки блоба, как для любого другого файла, и чтения его с помощью стандартных библиотек (таких как BeautifulSoup). Если XML-файл достаточно велик, вы рискуете исчерпать память, поэтому вы можете вместо этого рассмотреть подход на основе SAX, который не требует хранения всего файла в памяти.

Что касается сроков выполнения для обработки файла, вы почти наверняка захотите сделать это в очереди задач, где ограничения составляют 10 минут, и вы не будете заставлять пользователей ждать.

1 голос
/ 24 декабря 2010

PullDom позволяет загружать только часть XML-документа. К сожалению, официальная документация по Python довольно скудна. Более подробную информацию можно найти здесь и здесь .

0 голосов
/ 10 июня 2011

Это было довольно легко с помощью pulldom благодаря магии python, заставляющей все выглядеть одинаково. Просто проанализируйте читатель блоба, возвращенный из движка приложения, примерно так:

blob_reader = blobstore.BlobReader(blob_info.key())
events = pulldom.parse(blob_reader)

Это то, что мне больше всего нравится в Python, вы пробуете что-то, и это обычно работает.

0 голосов
/ 24 декабря 2010

Похоже, что App Engine не является подходящей платформой для этого проекта.

...