Вопрос по – Хранение большого блога с Objectify Appengine

5

У меня есть этот класс, который я хочу сохранить с помощью Objectify, этот класс будет представлять данные размером более 1 МБ, так что есть список объектов Blob, который представляет фрагмент хранимого массива байтов размером менее 1 МБ:

@Entity
public class BigBlob {

    @Id
    private Long id;
    public static final int FRAGMENT_LIMIT = 777 * 1024;
    @Serialized
    private List<Blob> fragments = new ArrayList<Blob>();

    ...

}

Тем не менее, «фрагменты» is @Serialized, который отображает размер этого класса / объекта BigBlob больше 1 МБ.

Вызывает эту ошибку:

com.google.apphosting.api.ApiProxy$RequestTooLargeException: The request to API call datastore_v3.Put() was too large.

Если я использую аннотацию @Embedded, я получаю эту ошибку:

Cannot place array or collection properties inside @Embedded arrays or collections

Как убедиться в том, что «фрагменты» хранятся как отдельная сущность?

Кстати, у меня уже есть логика разбивки байтов, которая разбивает весь байтовый массив и помещает фрагменты вList изBlob так что этот вопрос не касается того, как разрезать байты.

В основном то, что я хочу знать, - это больше о сохраняющейся стороне.

Ваш Ответ

2   ответа
2

ты в магазине, особенно если вы новичок в GAE и у вас возникли концептуальные проблемы с хранилищем данных.

С другой стороны, есть несколько веских причин использовать разделенные объекты для хранения больших двоичных объектов, особенно если вы храните данные, расположенные близко к фронту 1М. Вы не хотели бы делать это с каплями размером 100 МБ, но капли размером 2 МБ могут иметь смысл.

Прежде всего, вы не хотите сериализовать или внедрять. Это просто способы структурировать данные внутри единого объекта.

Кроме того, нет волшебной аннотации, которая позволяла бы разбивать капли между сущностями. Вы должны сделать все это вручную. Вам не нужно фактически создавать "master" или корневая сущность; просто создайте все фрагменты сущности с родителем, определенным идентификатором (но без фактической сущности), и используйте запрос ancestor () для извлечения всех фрагментов.

А с API API Blobstore сложно работать? И зачем вам транзакция, охватывающая хранилище больших двоичных объектов и хранилище данных?
Благодаря всем файлам и каналам, а также замкам, читателям и авторам API-интерфейс Java Files выглядит излишне развитым. API файлов Python, похоже, не сталкивается с той же проблемой, и это не объясняется языковыми различиями. Несмотря на то, что вам все еще нужен шаблон для создания многобъектных больших двоичных объектов, это простое и интуитивно понятное для кого-то, кто уже знаком с API хранилища данных. Но на самом деле основным аргументом для множественных объектов является возможность интеграции с транзакционной логикой вашего приложения.
По сравнению с простотой размещения () или получения () сущности, API-интерфейс «Файлы» является чудовищным, а использование обычного URL-адреса загрузки больших двоичных объектов очень инвазивен для логики программы. По поводу транзакций - почемуwouldn't вы хотите транзакции, которые охватывают blobstore и datastore? Я часто пишу блоб и некоторые дополнительные метаданные для этого блоба. Я должен пройти через некоторые важные обручи, чтобы сделать операцию транзакционной.
Вы, конечно, можете, но API-интерфейсы, связанные с хранилищем, трудны для работы, и их нелегко сделать транзакционными с другой работой хранилища данных. Иногда значительно проще использовать хранилище данных, даже при взломе нескольких сущностей. С другой стороны, хранилище хранилища данных дешевле хранилища хранилищ данных, поэтому этот выбор не следует делать легкомысленно.
& quot; С другой стороны, есть несколько веских причин использовать разделенные объекты для хранения больших двоичных объектов, особенно если вы храните данные, расположенные близко к фронту 1M & quot; - на самом деле, нет причин, по которым вы также не можете хранить большие двоичные объекты размером менее 1 МБ.
4

tify. Objectify работает поверх хранилища данных, а не из блоба.

Похожие вопросы