Devo creare un CSV e caricarlo su un bucket S3. Dal momento che sto creando il file al volo, sarebbe meglio se potessi scriverlo direttamente sul bucket S3 mentre viene creato piuttosto che scrivere l'intero file localmente e quindi caricare il file alla fine.Puoi caricare su S3 usando uno stream piuttosto che un file locale?
C'è un modo per farlo? Il mio progetto è in Python e sono abbastanza nuovo nella lingua. Ecco quello che ho provato finora:
import csv
import csv
import io
import boto
from boto.s3.key import Key
conn = boto.connect_s3()
bucket = conn.get_bucket('dev-vs')
k = Key(bucket)
k.key = 'foo/foobar'
fieldnames = ['first_name', 'last_name']
writer = csv.DictWriter(io.StringIO(), fieldnames=fieldnames)
k.set_contents_from_stream(writer.writeheader())
ho ricevuto questo errore: BotoClientError: s3 non supporta il trasferimento Chunked
UPDATE: ho trovato un modo di scrivere direttamente a S3, ma non posso trovare un modo per cancellare il buffer senza effettivamente eliminare le righe che ho già scritto. Così, per esempio:
conn = boto.connect_s3()
bucket = conn.get_bucket('dev-vs')
k = Key(bucket)
k.key = 'foo/foobar'
testDict = [{
"fieldA": "8",
"fieldB": None,
"fieldC": "888888888888"},
{
"fieldA": "9",
"fieldB": None,
"fieldC": "99999999999"}]
f = io.StringIO()
fieldnames = ['fieldA', 'fieldB', 'fieldC']
writer = csv.DictWriter(f, fieldnames=fieldnames)
writer.writeheader()
k.set_contents_from_string(f.getvalue())
for row in testDict:
writer.writerow(row)
k.set_contents_from_string(f.getvalue())
f.close()
Scrive 3 righe al file, ma io sono in grado di liberare la memoria per scrivere un file di grandi dimensioni. Se aggiungo:
f.seek(0)
f.truncate(0)
al ciclo, quindi viene scritta solo l'ultima riga del file. C'è un modo per rilasciare le risorse senza eliminare le righe dal file?
Anche se si potrebbe scrivere a S3 come vuoi tu, io non lo consiglio a causa di problemi di coerenza . Perché pensi che sarebbe meglio non scrivere localmente? Volete un oggetto S3 parziale se c'è stata un'eccezione o un problema? Presumo di no. – cgseller
Stavo cercando di scrivere direttamente per essere un po 'più efficiente. In sostanza se scrivo il file localmente e lo carico, sto aggiungendo il caricamento come passaggio aggiuntivo e pulendo il file locale. Non mi interessa avere un file incompleto - potrei avere un file incompleto se lo scrivo anche a livello locale. Il sistema sarà idempotente e cancellerà un file in uno stato di errore o lo proseguirà. –