Разбор частей Большого XML-файла в движке приложений с помощью Blobstore?



Я работаю над приложением Google app engine, которое будет иметь дело с некоторыми большими (


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



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

571   4  

4 ответов:

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

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

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

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

Похоже, что движок приложений не подходит для этого проекта.

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

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

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

Comments

    Ничего не найдено.