2016-05-13 14 views
9

私はBluemixで動作しているFlaskでPythonアプリケーションを使っています。コンテナを作成してファイルを保存するためにswiftclientモジュールでObject Storageを使用する方法を知っていますが、その中に含まれるjoblibまたはpickleファイルをどのようにダンプしますか?そして、私はそれを私のPythonプログラムにどのように戻しますか?Bluemix Object Storageでjoblibまたはpickleファイルをダンプするにはどうすればよいですか?

ここに、簡単なテキストファイルを保存するコードを示します。

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両方以来とPythonのドキュメントに思えるようpickle.dumps戻りオブジェクトをバイト:

pickle.dumps(OBJ、プロトコル=なし、*、fix_imports =真) リターンの漬け表現をオブジェクトをファイルに書き込むのではなく、バイトオブジェクトとして返します。

open(名前[、モード[バッファリング]] セクションファイルオブジェクトで説明されているファイルタイプのオブジェクトを返します。ファイルを開くことができない場合、IOErrorが発生します。ファイルを開くときは、ファイルコンストラクタを直接呼び出すのではなく、open()を使用することをお勧めします。

あなただけのようなobjとして保存したいオブジェクトに取り組むことができます:コンテンツタイプのこのような変化は、httpプロトコルにおける基準によるものです

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

。これは私が別のSOの質問から得た、確認してください。記載されているとおり:

事実上の基準です。 RFC2046の状態:4.5.3。その他のアプリケーション・サブタイプ将来、「アプリケーション」の他の多くのサブタイプが定義されることが予想されます。 MIME実装は、認識されないサブタイプを "application/octet-stream"と同等であるとして少なくとも処理しなければならない。したがって、非ピクルス対応のシステムでは、ストリームは他のオクテットストリームのように見えますが、ピクチャ対応システムの場合はこれが重要な情報です

+0

提案していただきありがとうございます。ファイルを保存するためのパスを取得しました。 "put_object"を含むファイルをコンテナに格納するだけです。 – sagar43

+0

更新された回答を確認してください。 – JeanPaulDepraz

+0

@JeanPaulDepraq答えがありがたいですが、pickle.dumps(obj)の "メモリ不足"の問題がまだ残っています。 "dump"はバイトを返し、次の行ではそのオブジェクトをファイルに保存しなければならないと言っているからです。つまり、ディスクスペースを一時的に使用しているということですか? 私の主な問題は、bluemixでは2GBの記憶領域しか持たないが、作成したpickleファイルは5GBなので、ファイルをオブジェクトストレージに保存する必要があるということです。 – sagar43

関連する問題