2016-05-13 5 views
9

Я работаю с приложением Python с Flask, работающим на Bluemix. Я знаю, как использовать Object Storage с модулем swiftclient для создания контейнера и сохранения в нем файла, но как я могу сбросить файл joblib или pickle, содержащийся в нем? И как загрузить его обратно в программу Python?Как сбросить файл joblib или pickle в хранилище объектов Bluemix?

Вот код для хранения простого текстового файла.

import swiftclient 

app = Flask(__name__) 
CORS(app) 


cloudant_service = json.loads(os.environ['VCAP_SERVICES'])['Object-Storage'][0] 
objectstorage_creds = cloudant_service['credentials'] 

if objectstorage_creds: 
    auth_url = objectstorage_creds['auth_url'] + '/v3' #authorization URL 
    password = objectstorage_creds['password'] #password 
    project_id = objectstorage_creds['projectId'] #project id 
    user_id = objectstorage_creds['userId'] #user id 
    region_name = objectstorage_creds['region'] #region name 

def predict_joblib(): 
    print('satart') 
    conn = swiftclient.Connection(key=password,authurl=auth_url,auth_version='3',os_options={"project_id": project_id,"user_id": user_id,"region_name": region_name}) 
    container_name = 'new-container' 

    # File name for testing 
    file_name = 'requirment.txt' 

    # Create a new container 
    conn.put_container(container_name) 
    print ("nContainer %s created successfully." % container_name) 

    # List your containers 
    print ("nContainer List:") 
    for container in conn.get_account()[1]: 
    print (container['name']) 

    # Create a file for uploading 
    with open(file_name, 'w') as example_file: 
    conn.put_object(container_name,file_name,contents= "",content_type='text/plain') 

    # List objects in a container, and prints out each object name, the file size, and last modified date 
    print ("nObject List:") 
    for container in conn.get_account()[1]: 
    for data in conn.get_container(container['name'])[1]: 
     print ('object: {0}t size: {1}t date: {2}'.format(data['name'], data['bytes'], data['last_modified'])) 

    # Download an object and save it to ./my_example.txt 
    obj = conn.get_object(container_name, file_name) 
    with open(file_name, 'w') as my_example: 
    my_example.write(obj[1]) 
    print ("nObject %s downloaded successfully." % file_name) 




@app.route('/') 
def hello(): 
    dff = predict_joblib() 
    return 'Welcome to Python Flask!' 

@app.route('/signUp') 
def signUp(): 
    return 'signUp' 


port = os.getenv('PORT', '5000') 
if __name__ == "__main__": 
    app.debug = True 
    app.run(host='0.0.0.0', port=int(port)) 

ответ

1

Так как file.open и pickle.dumps возвращает байты объектов, как кажется, на питон документы:

pickle.dumps (OBJ, протокол = None, *, fix_imports = True) Верните маринованное Представительство объект как объект байта, вместо того, чтобы записывать его в файл.

открытым (имя [режим [, буферные]]) Открыть файл, возвращая объект типа файла, описанного в разделе Файловые объекты. Если файл не открывается, IOError будет поднят. При открытии файла предпочтительнее использовать open() вместо прямого вызова конструктора файла.

Вы можете просто решить в объекте, который вы хотите сохранить в качестве obj как:

# Create a file for uploading 
file = pickle.dumps(obj) 
conn.put_object(container_name,file,contents= "",content_type='application/python-pickle') 

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

Это стандарт де-факто. RFC2046 гласит: 4.5.3. Другие подтипы приложений Ожидается, что многие другие подтипы «приложения» будут определены в будущем. Реализации MIME должны как минимум рассматривать любые непризнанные подтипы как эквивалентные «application/octet-stream». Таким образом, для системы с нечеткой памятью поток будет выглядеть как любой другой октет-поток, но для системы с включенным рассолом это жизненно важная информация.

+0

Спасибо за предложение, но у быстрого клиента мы не делаем получил путь для сохранения файла, нам просто нужно сохранить файл с «put_object» в контейнер. – sagar43

+0

Проверьте обновленный ответ. – JeanPaulDepraz

+0

@JeanPaulDepraq Спасибо за ответ, но я все еще получаю проблему «из памяти» на pickle.dumps (obj), , потому что, как вы говорите, «дамп» возвращает байты, а в следующей строке мне нужно сохранить этот объект в файле. Итак, что значит временно использовать мое дисковое пространство? Моя основная проблема заключается в том, что в bluemix у меня есть только 2 ГБ пространства для хранения, но файл pickle, который я создал, составляет 5 ГБ, поэтому мне нужно сохранить мой файл в хранилище объектов. – sagar43