2017-10-10 2 views
0

Ich habe folgende Aufgabe.
Ich muss eine Konsole-Anwendung erstellen, die einen Parameter verwendet, der die Anzahl der zu generierenden Daten ist. Die Daten sind die Adresse und der Name der Person. Ich erstelle eine Tabelle adress mit state, city, zip-code Felder. Ich erstelle auch eine Tabelle mit first und last name Spalten. Ich benutze HugSQL, um mit PostgreSQL umzugehen. Also ich möchte Adressen, Vor- und Nachname dynamisch mischen und so das Ergebnis in die Konsole drucken, die Anzahl der generierten Werte hängt von dem Argument ab, das an die Anwendung übergeben wird. Dies ist mein Code:Clojure bekommen Daten von db, transformieren und drucken in Konsole

(ns project.core 
    (:require 
    [project.db.get :as get])) 

(defn parse-int [s] 
    (Integer. (re-find #"\d+" s))) 

(def usa-data (get/usa)) 

(defn usa-adress-getter [] 
    (let [data (into {} (shuffle usa-data)) 
     city (get data :city) 
     state (get data :state) 
     zip (get data :zip_code)] 
    (str state " " city " " zip))) 

(defn repeater [times] 
    (dotimes [i times] 
    (println (usa-adress-getter)))) 

(defn -main [value] 
    (repeater (parse-int value))) 

Hier prüfe ich nur das Ergebnis der usa-adress-getter Funktion. Aber die Zeit der Auswertung der Funktion ist zu groß, ich habe Limit, das 1 Million Werte in 1 Minuten ist. Wie kann man die Geschwindigkeit der Auswertung erhöhen? Funktion (get/usa) rufen Sie alle Daten von adress Tabelle ab.

+0

Ihr 'usa-address-getter' sieht seltsam aus. Funktioniert es überhaupt richtig? Es sollte wirklich nicht, weil Sie 'clojure.core/get' mit' project.db/get'schatten. Bitte überprüfen Sie den Code – leetwinski

+0

auch '(in {} (shuffle usa-data))' sieht verdächtig, da usa-Daten eine Folge von Datensätzen zurückgeben sollte, so dass es zur Karte wie eine Nichtigkeit erscheint. Vielleicht sollte es '(in {} (erste (shuffle usa-data)))' '? Wie auch immer, diese Seiten sind der Schlüssel zu geringer Leistung: Sie millionieren bei jeder Iteration millionenfach und es ist wirklich langsam (ca. 250ms auf meinem Rechner). Ich würde dir raten, mit 'rand-nth':' (in {} (rand-nth usa-data)) ' – leetwinski

+0

auch wenn es nicht zwingend notwendig ist, Datensätze einzeln zu drucken, kann es besser sein, das Ganze zu konstruieren Sammlung und dann nur einmal drucken .. wie '(clojure.pprint/pprint (wiederholt (Parse-int-Wert) usa-Adresse-Getter))' und werfen Sie die 'Repeater'-Funktion weg – leetwinski

Antwort

0

Es ist schwierig, aus diesem Stück Code zu sagen, wo die Performance-Engpässe sind, aber hier sind ein paar Tipps:

  • Nutzungsart Hinweise für Hotspots. Manchmal kann der Clojure-Compiler die Typen nicht herausfinden, und dann können Tipp-Tipps die Dinge sehr beschleunigen. In diesem Fall könnten Sie die Abfrage so ändern, dass sie die verkettete Zeichenfolge aus der Datenbank zurückgibt (mithilfe einer SQL-Funktion wie concat). Auf diese Weise müssen Sie nicht die Werte aus dem Hash abrufen und die Zeichenfolge selbst erstellen.
  • Drucksachen können langsam sein, also könnten Sie das beseitigen, wie @leetwinsky sagt.
  • Sie müssen die Leistung Ihres Codes im Detail messen, sonst können Sie nicht feststellen, ob eine Änderung eine gewisse Geschwindigkeit erreicht hat. Zum Beispiel könnten Sie einen Timer setzen, der die Anzahl Msecs für jeweils 1000 verarbeitete Datensätze ausgibt. Natürlich nur eine Änderung gleichzeitig.

Hoffe das hilft.

Verwandte Themen