Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Printing Clojure从数据库获取数据,转换并打印到控制台_Printing_Clojure_Console_Hugsql - Fatal编程技术网

Printing Clojure从数据库获取数据,转换并打印到控制台

Printing Clojure从数据库获取数据,转换并打印到控制台,printing,clojure,console,hugsql,Printing,Clojure,Console,Hugsql,我有以下任务。 我需要创建一个控制台应用程序,它接受一个参数,即要生成的数据数。数据是个人地址和姓名。我创建了一个带有州、市、邮政编码字段的表地址。我还创建了一个包含名字和姓氏列的表。我使用HugSQL来处理PostgreSQL。所以我想动态地混合地址、名字和姓氏,并将结果打印到控制台中,生成的值的数量取决于传递给应用程序的参数。这是我的代码: (ns project.core (:require [project.db.get :as get])) (defn parse-int

我有以下任务。 我需要创建一个控制台应用程序,它接受一个参数,即要生成的数据数。数据是个人地址和姓名。我创建了一个带有州、市、邮政编码字段的表地址。我还创建了一个包含名字和姓氏列的表。我使用HugSQL来处理PostgreSQL。所以我想动态地混合地址、名字和姓氏,并将结果打印到控制台中,生成的值的数量取决于传递给应用程序的参数。这是我的代码:

(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)))
这里我只检查usa adress getter函数的结果。但是函数求值的时间太长了,我有一个限制,1分钟内有100万个值。如何提高评估的速度?
函数get/usa从adress表中检索所有数据。

从这段代码中很难说性能瓶颈在哪里,但这里有一些提示:

对热点使用类型提示。有时Clojure编译器无法找出类型,然后类型提示可以大大加快速度。在本例中,您可以在usa地址getter fn:defn^字符串usa address getter[]上设置它。。。 您可以考虑修改查询,以便使用像CONTAT这样的SQL函数从数据库返回级联字符串。这样,您就不需要从散列中获取值并自己构建字符串。 打印速度可能很慢,所以你可以消除它,就像@leetwinsky说的那样。 您必须详细衡量代码的性能,否则无法判断修改是否提高了速度。例如,您可以设置一个计时器,用于打印每处理1000条记录的毫秒数。当然,一次只做一次更改。
希望这有帮助。

你的美国地址获取者看起来很奇怪。它能正常工作吗?它真的不应该这样做,因为您使用project.db/get来隐藏clojure.core/get。请将代码也检查到{}shuffle usa data看起来可疑,因为usa data应该返回一系列记录,所以将其添加到地图看起来是不存在的。也许它应该进入{}第一次洗牌美国数据?无论如何,这些似乎是低性能的关键:你在每次迭代中急切地洗牌一百万个项目,而在我的机器上速度真的很慢,大约250毫秒。我建议您使用rand nth:into{}rand nth usa数据。如果不是强制要求逐个打印记录,那么最好构建整个集合,然后只打印一次。。就像clojure.pprint/pprint反复解析int值usa address getter并抛出repeater函数awayusa address getter函数一样,我只是将代码与db retrieve分开并放入get.clj中。此文件包含指向SQL的路径和函数defn usa[]all usa db/dbspec您能否提供usa数据示例和所需的输出