我正在尝试从Racket中的大型csv文件中解析日期.
最直接的方法是创建一个新date结构.但它需要week-day和year-day参数.当然我没有这些,这似乎date是我不理解的模块的真正弱点.
因此,作为替代方案,我决定使用find-seconds将原始日期值转换为秒,然后将其传递给seconds->date.这有效,但是非常慢.
(time
(let loop ([n 10000])
(apply find-seconds '(0 0 12 1 1 2012)) ; this takes 3 seconds for 10000
;(date 0 0 12 1 1 2012 0 0 #f 0) ; this is instant
(if (zero? n)
'done
(loop (sub1 n)))))
Run Code Online (Sandbox Code Playgroud)
find-seconds需要3秒才能完成10000个值,我有几百万个.创建date结构当然是即时的,但我没有周日,年日值.
我的问题是:
1.)为什么week-day/ year-day需要创建日期结构?
2.)find-seconds应该是这么慢(即bug)?或者我做错了什么?
3.)是否有任何替代方法可以快速解析日期.我知道srfi/19有一个string->date功能,但我必须改变一切以使用该模块的结构而不是球拍的内置结构.并且它可能遭受同样的性能命中,我不确定.
Racket用Racket写了多少?例如,argmax功能是在Racket还是在C中实现的?接下来怎么样?我在github的源代码中找不到它.
我之所以要问的是,作为一个Scheme/Racket新手,尝试尽可能多地优雅的Racket代码的源代码将非常有用,以便掌握功能/递归最佳实践.当然,如果一切都主要用C实现,那么对我来说这不是正确的方向.
或者,是否有一个"cookbook"或"examples"页面在线显示如何重新创建Racket中的许多内置插件,类似于"my-map"和"my-length"?
谢谢.
我试图让Geiser的REPL在Emacs中工作,但它似乎无法找到Racket.
racket 在我的路上,但任何时候我打字
run-geiser
Run Code Online (Sandbox Code Playgroud)
其次是
racket
Run Code Online (Sandbox Code Playgroud)
它抱怨:
无法启动REPL:搜索程序:没有这样的文件或目录,球拍
我在Geiser文档中读到,我可能需要手动告诉Geiser在哪里找到racket,但我不知道在哪里配置Geiser的这个属性.
谢谢你的帮助.
我是Scheme(通过Racket)和(在较小程度上)函数式编程的新手,并且可以通过变量和递归使用一些关于积累的优缺点的建议.出于本示例的目的,我正在尝试计算移动平均线.因此,对于列表'(1 2 3 4 5),3期移动平均线将是'(1 2 2 3 4).我们的想法是,期间之前的任何数字都不是计算的一部分,一旦我们达到集合中的期间长度,我们就会根据所选择的期间开始对列表的子集进行平均.
所以,我的第一次尝试看起来像这样:
(define (avg lst)
(cond
[(null? lst) '()]
[(/ (apply + lst) (length lst))]))
(define (make-averager period)
(let ([prev '()])
(lambda (i)
(set! prev (cons i prev))
(cond
[(< (length prev) period) i]
[else (avg (take prev period))]))))
(map (make-averager 3) '(1 2 3 4 5))
> '(1 2 2 3 4)
Run Code Online (Sandbox Code Playgroud)
这有效.我喜欢使用地图.它看起来很容易构建并且可以重构.我可以在将来看到堂兄弟像:
(map (make-bollinger 5) '(1 2 3 4 5))
(map (make-std-deviation 2) '(1 2 3 …Run Code Online (Sandbox Code Playgroud) 我希望将seq"chunk"为subseqs,与partition-by相同,不同的是该函数不应用于每个单独的元素,而是应用于一系列元素.
所以,例如:
(gather (fn [a b] (> (- b a) 2))
[1 4 5 8 9 10 15 20 21])
Run Code Online (Sandbox Code Playgroud)
会导致:
[[1] [4 5] [8 9 10] [15] [20 21]]
Run Code Online (Sandbox Code Playgroud)
同样:
(defn f [a b] (> (- b a) 2))
(gather f [1 2 3 4]) ;; => [[1 2 3] [4]]
(gather f [1 2 3 4 5 6 7 8 9]) ;; => [[1 2 3] [4 5 6] [7 8 9]]
Run Code Online (Sandbox Code Playgroud)
我的想法是我将列表的开头和下一个元素应用于函数,如果函数返回true,我们将列表的当前头部分区分割到新的分区.
我写过:
(defn gather
[pred? lst] …Run Code Online (Sandbox Code Playgroud) DB:Postgres 9.0客户端:Windows 7 Server Windows 2008,64位
我正在尝试远程连接到postgres实例,以便为我的本地计算机执行pg_dump.
一切都在我的客户端机器上工作,除了我需要在密码提示符下提供密码,我最终想用脚本批量处理它.
我按照这里的说明操作:
http://www.postgresql.org/docs/current/static/libpq-pgpass.html
但它不起作用.
回顾一下,我在服务器上创建了一个文件:C:/Users/postgres/AppData/postgresql/pgpass.conf其中postgresql是db用户.
该文件有一行包含以下数据:
\*:5432:\*postgres:[mypassword]
Run Code Online (Sandbox Code Playgroud)
我也试过来代替每个*有[localhost|myip]和[mydatabasename]分别.
从我的客户端机器,我连接使用:
pg_dump -h <myip> -U postgres -w [mydbname] > [mylocaldumpfile]
Run Code Online (Sandbox Code Playgroud)
我假设我需要提供-w交换机以忽略密码提示,此时它应该在服务器上的AppData目录中查找.
它回来了:
与数据库的连接失败:fe_sendauth:未提供密码.
任何见解都表示赞赏.
作为一个黑客解决方法,如果有一种方法,我可以告诉我的客户端机器上的Windows批处理文件在postgres提示符下注入密码,这也可以.
谢谢.
我有一个大约500k jpg文件的庞大目录,我想归档所有早于某个日期的文件.目前,该脚本需要数小时才能运行.
这与GoGrid的存储服务器非常糟糕的性能有很大关系,但与此同时,我确信有一种方法可以更有效地实现Ram/Cpu来完成我正在做的事情.
这是我的代码:
var dirInfo = new DirectoryInfo(PathToSource);
var fileInfo = dirInfo.GetFiles("*.*");
var filesToArchive = fileInfo.Where(f =>
f.LastWriteTime.Date < StartThresholdInDays.Days().Ago().Date
&& f.LastWriteTime.Date >= StopThresholdInDays.Days().Ago().Date
);
foreach (var file in filesToArchive)
{
file.CopyTo(PathToTarget+file.Name);
}
Run Code Online (Sandbox Code Playgroud)
Days().Ago()的东西只是语法糖.
我有以下代码:
var items = new List<string> {"1", "2", "3"}; // 200 items
foreach(var item in items) {
ThreadPool.QueueUserWorkItem((DoWork), item);
}
private void DoWork(object obj)
{
lock(this)
{
using(var sw = File.AppendText(@"C:\somepath.txt")
{
sw.WriteLine(obj);
}
}
}
Run Code Online (Sandbox Code Playgroud)
由于线程,出于某种原因,我得到了写入文件的200个项目的随机数.60或127或有时只有3.如果我删除ThreadPool并只在原始foreach循环内写入,则所有200个项目都会成功写入.
不知道为什么会这样?
谢谢你的帮助.
我有一个脚本,通过自定义ORM生成数万个插入到postgres数据库中.你可以想象,它很慢.这用于开发目的,以便创建虚拟数据.我可以在Postgres级别进行简单的优化,以加快速度吗?它是唯一一个按顺序运行的脚本,并且不需要线程安全.
也许我可以关闭所有锁定,安全检查,触发器等?只是寻找一个快速而肮脏的解决方案,这将大大加快这一过程.
谢谢.
当实体出现时,我很惊讶地发现datomic中的查询结果并不是懒惰的.
我错过了这个选择有明显的理由吗?有人可能想要这个似乎是合理的(映射some-fn(包含100个查询结果包含数百万)),但这会强制评估整个实体ID组,不是吗?
有没有办法直接从查询中获取一个懒惰的seq(实体-id),或者它们是否总是必须首先加载到内存中,只有通过实体可用的懒惰?
racket ×4
c# ×2
clojure ×2
postgresql ×2
accumulator ×1
bulkinsert ×1
datetime ×1
datomic ×1
emacs ×1
file-copying ×1
geiser ×1
locking ×1
performance ×1
recursion ×1
scheme ×1
sql ×1