2016-05-30 1 views
0

У меня есть экземпляр Object Storage на IBM Bluemix, и я пытаюсь загрузить файл SQLite размером 32 ГБ. Вот мой Python код, который использует API OpenStack Swift (с учетными данными удалены):Как загрузить большой файл SQLite в хранилище объектов с помощью OpenStack Swift (через Python)

import swiftclient 
conn = swiftclient.Connection(key="pw",authurl="url",auth_version='3',os_options={"project_id": "project_id","user_id": "user_id","region_name": "region"}) 
container_name = 'containerName' 
file_name = 'file.sqlite' 
with open(file_name, 'rb') as sqlite_file: 
    conn.put_object(container_name,file_name,sqlite_file) 

Я тестировал этот код с небольшим файлом .html и загружен без проблем. Когда я сменил файл на файл SQLite, он пробежал> 5 часов и в итоге дал сообщение «request.exceptions.ConnectionError: [Errno 32] Broken pipe». Что я делаю не так?

ответ

1

Вам необходимо будет ознакомиться с поддержкой и проявлением Swift DLO/SLO. Вот блог post, который может помочь с контекстом в отношении того, что проявляется, и различий между Static Large Object и поддержкой Dynamic Large Object.

В принципе, я бы рекомендовал следующий подход:

  1. Скачать/установить Python-SwiftClient двоичного
  2. Используйте свою команду загрузки в сочетании с учетными данными для хранения объекта от службы Bluemix. В приведенной выше статье он обсуждает этот подход here. Обратите внимание на команду , используя флаг --use-slo и возможность определять размер сгенерированных скрещенных сегментов. Грубо говоря, вызов будет выглядеть следующим образом:

$ swift --os-auth-url=https://identity.open.softlayer.com/v3 --os-user- id=some_hex_value --os-password="weird_characters" --os-project-id=another_hex_value --os-region-name=dallas -V 3 upload my_object_storage_container_name -S int_seg_size_in_bytes my_local_large_file_with_some_extension --use-slo

my_local_large_file_with_some_extension segment 3 
my_local_large_file_with_some_extension segment 1 
my_local_large_file_with_some_extension segment 2 
my_local_large_file_with_some_extension segment 0 
my_local_large_file_with_some_extension/1443450560.000000/160872806/52428800/00000002 
my_local_large_file_with_some_extension/1443450560.000000/160872806/52428800/00000003 
my_local_large_file_with_some_extension/1443450560.000000/160872806/52428800/00000001 
my_local_large_file_with_some_extension/1443450560.000000/160872806/52428800/00000000 
my_local_large_file_with_some_extension 

удачи.

+0

Теперь он работает. Некоторые сегменты работают, а некоторые из них выходят из строя: put_object (u'RossL_segments ', u'bigfile.sqlite/slo/1438471533.000000/31807655936/200000000/00000007', ...) сбой и невозможность сбросить содержимое для reupload. Любые советы по этому вопросу? –

+1

@RossLewis В быстрых документах [здесь] (http://docs.openstack.org/cli-reference/swift.html#swift-upload) вы можете повторно запустить команду, используя ** - leave-segment ** аргумент, чтобы попытаться получить повторные загрузки сбоев. Время от времени я сталкивался с ошибками сегментов загрузки и обычно получаю успешное выполнение после повторной попытки. Вы также можете настроить размер сегмента и количество потоков в соответствии с вашими сетевыми характеристиками. –

+0

Еще раз спасибо за помощь в этом! Теперь, когда я загрузил файл, могу ли я избавиться от всех сегментов в контейнере _segment? –

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