Sto usando openpyxl in python e sto provando a eseguire 50k linee e prendere i dati da ogni riga e inserirli in un file. Comunque ... quello che sto scoprendo è che corre incredibilmente lento più lontano ci arrivo. Le prime linee da 1k diventano super veloci, meno di un minuto, ma dopo ci vuole più tempo, sempre più tempo per fare le successive linee da 1k.Il modo più veloce per eseguire file da 50k di file Excel in OpenPYXL
Stavo aprendo un file .xlsx. Mi chiedo se è più veloce aprire un file .txt come csv o qualcosa del genere o leggere un file json o qualcosa del genere? O convertire in qualche modo in qualcosa che leggerà più velocemente?
Ho 20 valori univoci in una data colonna e quindi i valori sono casuali per ogni valore. Sto cercando di afferrare una stringa dell'intera colonna del valore univoco per ogni valore.
Value1: 1243,345,34,124, Valore2: 1243,345,34,124, ecc, ecc
sto correndo attraverso l'elenco valore, vedere se esiste il nome di un file, se lo fa , quindi accederà a quel file e aggiungerà ad esso il nuovo valore, se il file non esiste, creerà il file e quindi lo imposterà. Ho un dizionario che ha tutte le cose "aggiungi file di scrittura" ad esso collegate, quindi ogni volta che voglio scrivere qualcosa, prenderà il nome del file, e la cosa di append sarà disponibile nel dict, la cercherà e scrivi su quel file, quindi non continua ad aprire nuovi file ogni volta che viene eseguito.
Il primo 1k ha impiegato meno di un minuto .. ora sono su dischi da 4k a 5k, ed è in esecuzione tutti i 5 minuti pronti .. sembra che impieghi più tempo mentre sale nei record, mi chiedo come accelerare su. Non sta affatto stampando sulla console.
writeFile = 1
theDict = {}
for row in ws.iter_rows(rowRange):
for cell in row:
#grabbing the value
theStringValueLocation = "B" + str(counter)
theValue = ws[theStringValueLocation].value
theName = cell.value
textfilename = theName + ".txt"
if os.path.isfile(textfilename):
listToAddTo = theDict[theName]
listToAddTo.write("," + theValue)
if counter == 1000:
print "1000"
st = datetime.datetime.fromtimestamp(ts).strftime('%Y-%m-%d %H:%M:%S')
else:
writeFileName = open(textfilename, 'w')
writeFileName.write(theValue)
writeFileName = open(textfilename, 'a')
theDict[theName] = writeFileName
counter = counter + 1
ho aggiunto alcuni francobolli di tempo per il codice di cui sopra, non è lì, ma si può vedere l'output di seguito. Il problema che sto vedendo è che sta salendo sempre più in alto ogni 1k di corsa. 2 minuti la prima volta, 3 minuti, poi 5 minuti, poi 7 minuti. Quando arriva a 50k, sono preoccupato che ci vorrà un'ora o qualcosa e ci vorrà troppo tempo.
1000
2016-02-25 15:15:08
20002016-02-25 15:17:07
30002016-02-25 15:20:52
2016-02-25 15:25:28
4000
2016-02-25 15:32:00
5000
2016-02-25 15:40:02
6000
2016-02-25 15:51:34
7000
2016-02-25 16:03:29
8000
2016-02-25 16:18:52
9000
2016-02-25 16:35:30
10000
Qualcosa che dovrei mettere in chiaro .. Io non so i nomi dei valori prima del tempo, forse dovrei correre attraverso e prendere quelli in uno script python separata per rendere questo andare più veloce?
In secondo luogo, ho bisogno di una stringa di tutti i valori separati da virgola, è per questo che l'ho messo in un file di testo per afferrare in seguito. Stavo pensando di farlo da una lista come mi è stato suggerito, ma mi chiedo se avrà lo stesso problema. Sto pensando che il problema abbia a che fare con la lettura di Excel. Ad ogni modo posso ottenere una stringa separata da una virgola, posso farlo in un altro modo.
O forse potrei fare try/catch invece di cercare il file ogni volta, e se c'è un errore, posso assumere per creare un nuovo file? Forse la ricerca ogni volta sta facendo andare davvero lento? il Se il file esiste?
questa domanda è una continuazione del mio originale qui ed io abbiamo preso alcuni suggerimenti da lì .... What is the fastest performance tuple for large data sets in python?
L'indentazione del codice è sbagliato, che significa che non possiamo sapere come sono strutturati i tuoi anelli. Perché stai ripetendo le celle e poi accedendo a una cella nella colonna B di una riga? Immagino che 'ws [" B "+ str (counter)]. Value' sia eseguito in tempo lineare. 'contatore', non in tempo costante. – roeland
no il rientro non è sbagliato. hai capito ... sto prendendo due valori. quello B è dove si trova il "valore". il "cell.value" è il nome. sto usando il contatore per afferrare quello sulla stessa fila l'uno dell'altro. – king
oh sì, hai ragione .. ci dovrebbe essere un rientro dopo per cella in fila .. lo aggiusterò – king