2016-04-11 6 views
1

Я использую следующий код:Google облако хранения с использованием потока вместо ByteBuffer - Java

GcsService gcsService = GcsServiceFactory.createGcsService(); 
    GcsFilename filename = new GcsFilename(BUCKETNAME, fileName); 
    GcsFileOptions options = new GcsFileOptions.Builder() 
     .mimeType(contentType) 
     .acl("public-read") 
     .addUserMetadata("myfield1", "my field value") 
     .build(); 
    @SuppressWarnings("resource") 
    GcsOutputChannel outputChannel = 
     gcsService.createOrReplace(filename, options); 
    outputChannel.write(ByteBuffer.wrap(byteArray)); 
    outputChannel.close(); 

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

Но я не могу найти какой-либо интерфейс, чтобы сделать то же самое с потоком.

вопросы:

  1. Должен ли я беспокоиться о проблемах MEM в Appengine СРВ, или они способны держать 1 мин видео с в мем?

  2. Возможно ли использовать поток вместо массива байтов? как?

  3. Я читаю байты как byte[] byteArray = IOUtils.toByteArray(stream); Должен ли я использовать массив байтов в качестве реального буфера и просто читать куски и загружать их в GCS? как это сделать?

ответ

0

Объем доступной памяти зависит от выбранного типа экземпляра appengine. Потоковая передача этих данных представляется хорошей идеей, если можно.

Не уверен, что о GcsService апи, но выглядит, как вы можете сделать это с помощью API gcloud хранения: https://github.com/GoogleCloudPlatform/gcloud-java/blob/master/gcloud-java-storage/src/main/java/com/google/cloud/storage/Storage.java

Этот код может работать (непроверенные) ...

final BlobInfo info = BlobInfo.builder(bucket.getBucketName(), "name").contentType("image/png").build(); 

final ReadableByteChannel src = Channels.newChannel(stream); 
final WriteChannel dst = gcsStorage.writer(info); 

fastChannelCopy(src, dst); 

private void fastChannelCopy(final ReadableByteChannel src, final WritableByteChannel dest) throws IOException { 
    final ByteBuffer buffer = ByteBuffer.allocateDirect(16 * 1024); 
    while (src.read(buffer) != -1) { 
     buffer.flip();  // prepare the buffer to be drained 
     dest.write(buffer); // write to the channel, may block 
     // If partial transfer, shift remainder down 
     // If buffer is empty, same as doing clear() 
     buffer.compact(); 
    } 
    // EOF will leave buffer in fill state 
    buffer.flip(); 

    // make sure the buffer is fully drained. 
    while (buffer.hasRemaining()) { 
     dest.write(buffer); 
    } 
} 
+0

Обратите внимание, что блоб API больше не поддерживается - я не думаю, что этот код будет работать. –

+1

Это не blob api. Просто потому, что вы видите класс с именем BlobInfo, это не значит, что это неподдерживаемый blob api. В настоящее время я использую этот api в производственной системе, которая получает значительный трафик. Пожалуйста, посмотрите здесь и пересмотрите ваш downvote: http://googlecloudplatform.github.io/gcloud-java/0.2.0/index.html – depsypher

Смежные вопросы