2016-05-13 31 views
9

Sto lavorando con un'applicazione Python con Flask in esecuzione su Bluemix. So come usare Object Storage con il modulo swiftclient per creare un container e salvare un file al suo interno, ma come faccio a scaricare un joblib o un file pickle contenuto al suo interno? E come posso ricaricarlo nel mio programma Python?Come si esegue il dump di un file joblib o pickle in Bluemix Object Storage?

Ecco il codice per memorizzare un semplice file di testo.

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)) 

risposta

1

Dato che sia file.open e pickle.dumps rendimenti Byte di oggetti come sembrano sulla documentazione pitone:

pickle.dumps (obj, protocollo = None, *, fix_imports = true) restituire la rappresentazione in salamoia della oggetto come oggetto byte, invece di scriverlo su un file.

aperta (nome [, mode [, il buffering]]) Aprire un file, restituisce un oggetto del tipo di file descritto nella sezione del file oggetti. Se il file non può essere aperto, viene sollevato IOError. Quando si apre un file, è preferibile utilizzare open() invece di richiamare direttamente il costruttore di file.

Si può solo affrontare in oggetto che si desidera memorizzare come obj come:

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

Questo cambiamento nel tipo di contenuto è dovuta a standard di protocollo http. Questo ho ottenuto da un'altra domanda SO, per favore controlla. Come indicato:

È lo standard di fatto. RFC2046 afferma: 4.5.3. Altri sottotipi di applicazioni Si prevede che molti altri sottotipi di "applicazione" saranno definiti in futuro. Le implementazioni MIME devono trattare almeno tutti i sottotipi non riconosciuti come equivalenti a "application/octet-stream". Quindi, per un sistema non-pickle-aware, lo stream sarà simile a qualsiasi altro flusso ottetto, ma per un sistema abilitato a pickle questa è un'informazione vitale

+0

Grazie per il suggerimento ma in un client veloce non lo facciamo ottenuto il percorso per salvare il file, dobbiamo solo memorizzare il file con "put_object" nel contenitore. – sagar43

+0

Controlla la risposta aggiornata. – JeanPaulDepraz

+0

@JeanPaulDepraq Grazie per la risposta, ma sto ancora ricevendo "memoria insufficiente" su pickle.dumps (obj), perché come dici "dump" restituisce i byte e nella riga successiva devo salvare quell'oggetto nel file. Quindi, che significa che sta usando temporaneamente il mio spazio sul disco? Il mio problema principale è che in bluemix ho solo 2 GB di spazio per l'archiviazione, ma il file pickle che ho creato è 5GB, quindi devo salvare il mio file nell'archivio oggetti. – sagar43