Frage

Ich bin in Python zu entwickeln, noch neu im Spiel, und ich mag, sicherzustellen, dass ich richtig dieses Problem anzugehen. Ich werde gerne alle Ratschläge annehmen.

Stellen Sie versuchen, Daten über mehrere flache Dateien gespeichert zu verwenden, in vielen Fällen mit einer Gesamtgröße von mehr als 20 bis 35 gb. Im allgemeinsten Fall können diese Dateien begrenzt werden (csv, tab) oder einfach mit fester Breite werden können. Das Ziel ist es, diese Dateien zu nehmen, oder eine Teilmenge von jeder Datei, analysiert die Eingabe (jede Spalte eine Variable in Daten darstellt), und es bis zu einem gewissen Ziel senden (die lokal oder remote SQL sein könnte, einige andere lokale Datei in einer Vielzahl von Ausgabeformaten wie Text oder ein proprietäres Datenformat wie Stata des .dta)

Das Ziel ist, die verfügbaren Systemressourcen zu nutzen, um diese Operation in dem schnellsten Weg zu leiten möglich (ich denke, in Bezug auf kb pro Sekunde?)

Fragen:

  1. Gibt es einen Effizienzgewinn von C kompiliert unter Verwendung der Leseoperationen zu tun? Wenn ja, in welcher Bibliothek soll ich lernen, wie zu benutzen? Und sollte c auch die Analyse und Ausgabe tun?

  2. Wenn die Datei in einer .zip oder .gz kommt, sollte die gesamte Datei zu lesen und zu schreiben, bevor dekomprimiert werden wollen, oder lassen Sie es komprimiert und verwenden, um eine Bibliothek der Lage, aus der komprimierten Datei zu lesen?

  3. Sollte das Programm Verwendung Multi-Threading? Ich stelle mir eine Teilmenge einer Datei zu lesen (zum Beispiel n Zeilen zu einer Zeit), Parsen und zur Ausgabe in, sagen wir, j Threads. Es ist nicht offensichtlich, dass in einer Zeit, die Datei eine Zeile zu lesen optimal ist ... und es scheint, wie die optimale Anzahl von Threads und Prozessen hängen von den Ressourcen abhängen verfügbar und der Größe des Auftrags.
    Also, vielleicht sollte der Code ‚smart‘ genug, um optimal zu bestimmen, wie viele Threads zu verwenden und wie viel Arbeit sollte jeder Thread zu tun zu erwarten.

  4. Wie kann man messen und vergleichen zu Effizienz zwischen verschiedenen Methoden?

  5. das Programm in der Lage sein, diese dynamisch zu tun und Input-Output-Methoden wählen, auf der Grundlage ihrer Leistung? (Will Methode A immer streng dominieren Methode B, oder tut idiosynkratische Veränderungen in der Materie Implementierungsumgebung)

Just klar zu sein, ich bin bereit, fast jede Ebene des Code Ineffizienz im Austausch für nicht zu vernachlässigenden Verbesserungen der Ressourceneffizienz zu akzeptieren

Ich hoffe, diese Fragen eine klare Vorstellung davon, was ich versuche, um herauszufinden. Meine Programmiererfahrung ist vor allem auf wissenschaftliche / statistische Pakete beschränkt, so dass, wenn jede meiner Fragen einkochen zu ‚rtm‘, benutzen Sie bitte das entsprechende Handbuch sanft und schlagen sein.

War es hilfreich?

Lösung

  

Gibt es einen Effizienzgewinn von mit kompiliertem C die Leseoperationen zu tun?

Nicht wirklich. Die Begrenzung wird I / O-Bandbreite und Python verwendet, um die zugrunde liegenden C-Bibliotheken.

  

Wenn die Datei in einem .zip oder .gz kommt, soll die gesamte Datei vor dem Lesen und Schreiben dekomprimiert werden will, oder lassen Sie es komprimiert und verwenden, um eine Bibliothek der Lage, aus der komprimierten Datei zu lesen?

Als erstes und alles andere an die Arbeit. Versuchen Sie nicht, diese vorne Finesse. Pythons ZipFile Implementierung kann durch das Öffnen ZIP-Archiv Mitglieder CSV-Format-Dateien verarbeiten, ohne sie zu erweitern.

Ist das schneller? Sie können nicht im Voraus wissen. Sie können nur durch den Aufbau und Mess wissen, was Sie aufgebaut. Wringen Sie Ihre Hände. Es ist nur ein paar Zeilen Code. Bauen Sie beide.

  

Sollte das Programm Verwendung Multithreading?

Nein.

Mit OS-Level-Multi-Processing.

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

Dies wird sehr schnell sein und - ohne viel Arbeit -. Wird mit alle die zur Verfügung stehenden Ressourcen OS

  

Wie kann man messen und vergleichen zu Effizienz zwischen verschiedenen Methoden?

Ähm ... Das ist eine dumme Frage. Sie bauen es und es messen. Verstrichene Zeit ist so gut ein Maß als irgendetwas anderes. Wenn Sie verwirrt sind, verwenden Sie eine Stoppuhr. Ernsthaft. Es gibt keine Magie.

  

das Programm in der Lage sein, diese dynamisch zu tun und Input-Output-Methoden wählen, auf der Grundlage ihrer Leistung?

Nein.

  

(Will Methode A immer streng dominieren Methode B, oder tun idiosynkratische Veränderungen in der Materie Implementierungsumgebung)

Ja. Und ja. Einige Methoden sind immer effizienter. Jedoch ist ein O ist höllisch komplex, so dass nichts Ersatz für einfaches, flexible, komponentenbasierte Design.

Erstellen einfache Stücke, die flexibel kombiniert werden können.

Do not Hand auswringen im Voraus. Entwerfen Sie die richtige Datenstruktur und Algorithmus, wenn Sie können. Wenn Sie nicht können, wählen Sie einfach etwas Vernünftiges und ziehen weiter. etwas und Tuning zu bauen ist viel einfacher, als Details über Reibverschleiß, nur um herauszufinden, dass sie nie ankommt.

  1. Bauen Etwas.

  2. Maßnahme.

  3. Finden Sie den Engpass.

  4. Optimieren nur die bewährten Engpässe.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top