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.
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
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
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