Распоряжение части большого XML -файла в App Engine с помощью Blobstore?

StackOverflow https://stackoverflow.com/questions/4522434

Вопрос

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

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

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

Это было полезно?

Решение

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

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

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

Другие советы

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

Это действительно звучит так, что App Engine не является правильной платформой для этого проекта.

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top