Nano Hash - криптовалюты, майнинг, программирование

Чтение файла appengine backup_info дает EOFError

Я пытаюсь проверить свои файлы резервных копий appengine, чтобы определить, когда произошло повреждение данных. Я использовал gsutil для поиска и загрузки файла:

gsutil ls -l gs://my_backup/ > my_backup.txt
gsutil cp gs://my_backup/LongAlphaString.Mymodel.backup_info file://1.backup_info

Затем я создал небольшую программу на Python, пытаясь прочитать файл и проанализировать его с помощью библиотек appengine.

#!/usr/bin/python

APPENGINE_PATH='/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/'
ADDITIONAL_LIBS = [
'lib/yaml/lib'
]
import sys
sys.path.append(APPENGINE_PATH)
for l in ADDITIONAL_LIBS:
  sys.path.append(APPENGINE_PATH+l)

import logging
from google.appengine.api.files import records
import cStringIO

def parse_backup_info_file(content):
  """Returns entities iterator from a backup_info file content."""
  reader = records.RecordsReader(cStringIO.StringIO(content))
  version = reader.read()
  if version != '1':
    raise IOError('Unsupported version')
  return (datastore.Entity.FromPb(record) for record in reader)


INPUT_FILE_NAME='1.backup_info'

f=open(INPUT_FILE_NAME, 'rb')
f.seek(0)
content=f.read()
records = parse_backup_info_file(content)
for r in records:
  logging.info(r)

f.close()

Код для parse_backup_info_file был скопирован из backup_handler.py

Когда я запускаю программу, я получаю следующий вывод:

./view_record.py 
Traceback (most recent call last):
  File "./view_record.py", line 30, in <module>
    records = parse_backup_info_file(content)
  File "./view_record.py", line 19, in parse_backup_info_file
    version = reader.read()
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/api/files/records.py", line 335, in read
    (chunk, record_type) = self.__try_read_record()
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/api/files/records.py", line 307, in __try_read_record
    (length, len(data)))
EOFError: Not enough data read. Expected: 24898 but got 2112

Я попробовал полдюжины разных файлов backup_info, и все они показывают одну и ту же ошибку (с разными номерами). Я заметил, что все они имеют одинаковую ожидаемую длину: Я был просматривая разные версии одной и той же модели, когда я сделал это наблюдение, это неверно, когда я просматриваю файлы резервных копий других модулей.

EOFError: Not enough data read. Expected: 24932 but got 911
EOFError: Not enough data read. Expected: 25409 but got 2220

Есть ли что-то явно неправильное в моем подходе?

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


Ответы:


1

При выполнении резервного копирования AppEngine Datastore создается несколько файлов метаданных:

LongAlphaString.backup_info создается один раз. Он содержит метаданные обо всех типах сущностей и файлах резервных копий, созданных в резервной копии хранилища данных.

LongAlphaString.[EntityType].backup_info создается один раз для каждого типа сущности. Он содержит метаданные о конкретных файлах резервных копий, созданных для [EntityType], а также информацию о схеме для [EntityType].

Ваш код работает для опроса содержимого файла LongAlphaString.backup_info, однако кажется, что вы пытаетесь опросить содержимое файла LongAlphaString.[EntityType].backup_info. Вот скрипт, который будет печатать содержимое в удобочитаемом формате для каждого типа файла:

import cStringIO
import os
import sys

sys.path.append('/usr/local/google_appengine')
from google.appengine.api import datastore
from google.appengine.api.files import records
from google.appengine.ext.datastore_admin import backup_pb2

ALL_BACKUP_INFO = 'long_string.backup_info'
ENTITY_KINDS = ['long_string.entity_kind.backup_info']


def parse_backup_info_file(content):
    """Returns entities iterator from a backup_info file content."""
    reader = records.RecordsReader(cStringIO.StringIO(content))
    version = reader.read()
    if version != '1':
        raise IOError('Unsupported version')
    return (datastore.Entity.FromPb(record) for record in reader)


print "*****" + ALL_BACKUP_INFO + "*****"
with open(ALL_BACKUP_INFO, 'r') as myfile:
    parsed = parse_backup_info_file(myfile.read())
    for record in parsed:
        print record

for entity_kind in ENTITY_KINDS:
    print os.linesep + "*****" + entity_kind + "*****"
    with open(entity_kind, 'r') as myfile:
        backup = backup_pb2.Backup()
        backup.ParseFromString(myfile.read())
        print backup
06.10.2014
  • Согласно Google, пакет google.appengine.api.files теперь устарел, и я не вижу никакой замены для этих функций в предлагаемой библиотеке Google Cloud Storage. Теперь наши данные навсегда заблокированы в Google Cloud Datastore? cloud.google.com/appengine/docs/ стандарт/python/refdocs/ 16.11.2017
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..