3 Stimmen

Beeinträchtigt eine mehrfache Abzweigung die Leistung?

Ich muss Protokolldateien (.CSV) mit fastercsv lesen und den Inhalt in einer Datenbank speichern (jeder Zellenwert ist ein Datensatz). Die Sache ist, es gibt etwa 20-25 Log-Dateien, die täglich gelesen werden muss und diese Log-Dateien sind wirklich groß (jede CSV-Datei ist mehr als 7Mb). Ich hatte den Leseprozess geforkt, damit der Benutzer nicht lange warten muss, aber das Lesen von 20-25 Dateien dieser Größe dauert immer noch (mehr als 2 Stunden). Jetzt möchte ich das Lesen jeder Datei aufspalten, d.h. es werden etwa 20-25 Kindprozesse erstellt, meine Frage ist, kann ich das tun? Wenn ja, wird es die Leistung beeinträchtigen und ist fastercsv in der Lage, dies zu bewältigen? ex:

for report in @reports
  pid = fork {
   .
   .
   .
   }
  Process.dispatch(pid)
end

PS: Ich benutze Rails 3.0.7 und seine gehen, um in Server, die in Amazon's große Instanz (7,5 GB Arbeitsspeicher, 4 EC2 Compute Units (2 virtuelle Kerne mit 2 EC2 Compute Units jeweils), 850 GB der lokalen Instanz Speicher, 64-Bit-Plattform) ausgeführt wird passieren

1voto

Rory Hunter Punkte 3237

Wenn die Speicherung ausschließlich lokal erfolgt (und ich bin mir nicht sicher, ob man das wirklich sagen wir mal, wenn Sie in der Cloud sind), dann ist es unwahrscheinlich, dass das Forking einen Geschwindigkeitszuwachs bringt, weil der langsamste Teil der Operation die Disk-I/O sein wird (es sei denn, Sie führen ernsthafte Berechnungen mit Ihren Daten durch). Der Zugriff auf die Festplatte über mehrere Prozesse wird das nicht sofort beschleunigen, obwohl ich vermute, dass es ein wenig helfen könnte, wenn die Festplatte einen großen Cache hat.

Außerdem sind 7 MB CSV-Daten nicht wirklich viel - Sie könnten eine bessere Beschleunigung erzielen, wenn Sie einen schnelleren Weg zum Einfügen der Daten finden würden. Einige Datenbanken bieten eine Massenladefunktion, mit der Sie formatierte Daten direkt laden können, oder Sie könnten jede Zeile in eine INSERT-Datei umwandeln und diese direkt in die Datenbank einfügen. Ich weiß nicht, wie Sie es im Moment machen, also sind das nur Vermutungen.

Natürlich kann man sich nur dann sicher sein, wenn man es ausprobiert!

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X