Domanda

sto sviluppando in python, ancora nuovi al gioco, e voglio essere sicuro di affrontare questo problema in modo corretto. Accetterò volentieri tutti i consigli.

Immaginate di provare a utilizzare i dati memorizzati in più file flat, in molti casi con una dimensione complessiva superiore 20-35 gb. Nel caso più generale, questi file possono essere delimitati (csv, tab) o possono essere semplicemente fissati larghezza. L'obiettivo è quello di prendere questi file, o un sottoinsieme di ogni file, analizzare l'ingresso (ogni colonna rappresenta una variabile nei dati), e inviarlo a una destinazione (che potrebbe essere SQL locale o remoto, qualche altro file locale in una varietà di formati di output, tra cui testo o un formato dati proprietario come .dta di Stata)

L'obiettivo è quello di utilizzare le risorse di sistema disponibili per condurre questa operazione nel modo più rapido possibile (credo che in termini di KB al secondo?)

Domande:

  1. C'è un guadagno di efficienza di utilizzare compilato C per fare le operazioni di lettura? In caso affermativo, quale libreria dovrei imparare ad usare? E, dovrebbe c anche fare il parsing e l'uscita?

  2. Se il file viene fornito in un file .zip o .gz, dovrebbe l'intero file decompresso prima di leggere e scrivere, o ti lascia compresso e di utilizzare un grado libreria di lettura dal file compresso?

  3. necessario utilizzare il programma multi-threading? Immagino che la lettura di alcuni sottoinsieme di un file (ad esempio, n righe alla volta), l'analisi e l'output, per esempio, le discussioni j. Non è ovvio che la lettura del file una riga alla volta è ottimale ... e sembra che il numero ottimale di thread e processi dipendono dalle risorse disponibili e la dimensione del lavoro.
    Quindi, forse il codice dovrebbe essere abbastanza 'intelligente' per determinare in modo ottimale il numero di thread da utilizzare e quanto lavoro ogni thread dovrebbe essere previsto di fare.

  4. Come si fa a misurare e confrontare l'efficienza tra i diversi metodi?

  5. Qualora il programma sia in grado di fare questo in modo dinamico e scegliere metodi di input di uscita in base alle loro prestazioni? (Will metodo A metodo sempre rigorosamente dominare B, o fare cambiamenti idiosincratiche in materia di ambiente di distribuzione)

Giusto per essere chiari, io sono disposto ad accettare qualsiasi livello di codice di inefficienza in cambio di miglioramenti non trascurabili in termini di efficienza delle risorse

spero che queste domande forniscono una chiara idea di quello che sto cercando di capire. La mia esperienza di programmazione è per lo più limitato ai pacchetti scientifici / statistici, quindi se qualcuno dei miei domande si riducono a 'RTM', cerca di essere gentile e suggeriscono il manuale appropriato.

È stato utile?

Soluzione

  

C'è un guadagno di efficienza da utilizzare stilato un elenco di C per fare le operazioni di lettura?

Non proprio. La limitazione sarà la larghezza di banda di I / O e Python utilizza le librerie C sottostanti.

  

Se il file viene fornito in un file .zip o .gz, dovrebbe l'intero file decompresso prima di leggere e scrivere, o ti lascia compresso e di utilizzare un grado libreria di lettura dal file compresso?

In primo luogo, avere tutto il resto a lavorare bene. Non cercare di finezza su questo fronte. implementazione ZipFile di Python in grado di elaborare i file in formato CSV dai membri dell'archivio apertura di avviamento postale senza di loro espansione.

E 'questo più veloce? Non si può sapere in anticipo. È possibile conoscere solo con la costruzione di esso e misurare ciò che avete costruito. Non strizzare le mani. E 'solo un paio di righe di codice. Costruisce sia.

  

Qualora l'utilizzo del programma multithreading?

No.

Usa-livello di sistema operativo multi-processing.

python something.py source.zip | python part2.py | python part3.py | python part4.py >result

Questo sarà incredibilmente veloce e - senza molto lavoro -. Utilizzerà tutti le risorse disponibili OS

  

Come si fa a misurare e confrontare l'efficienza tra i diversi metodi?

Ummm ... Questa è una domanda stupida. Si costruisce e si misura esso. il tempo trascorso è buono una misura come qualsiasi altra cosa. Se siete confusi, utilizzare un cronometro. Sul serio. Non c'è nessuna magia.

  

Qualora il programma sia in grado di fare questo in modo dinamico e scegliere metodi di uscita di input basato sulle loro prestazioni?

No.

  

(Will metodo A dominare sempre rigorosamente il metodo B, o fare cambiamenti idiosincratiche in materia di ambiente di distribuzione)

Sì. E sì. Alcuni metodi sono sempre più efficienti. Tuttavia, un sistema operativo è tremendamente complesso, in modo da sostituti nulla per semplice, design flessibile a componenti.

pezzi Costruire semplici che possono essere ricombinati in modo flessibile.

Do not mano strizzare in anticipo. Progettare la struttura di dati a destra e l'algoritmo quando si può. Quando non si può, basta scegliere qualcosa di sensato e andare avanti. Costruire qualcosa e messa a punto è molto più facile che fretting sui dettagli solo per scoprire che non hanno mai importava.

  1. costruire qualcosa.

  2. Misura.

  3. Trova il collo di bottiglia.

  4. Ottimizza solo i colli di bottiglia provati.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top