小编Sco*_*ach的帖子

试图从Racket中的字符串创建日期 - find-seconds非常慢,每周工作日需要?

我正在尝试从Racket中的大型csv文件中解析日期.

最直接的方法是创建一个新date结构.但它需要week-dayyear-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功能,但我必须改变一切以使用该模块的结构而不是球拍的内置结构.并且它可能遭受同样的性能命中,我不确定.

datetime racket

12
推荐指数
1
解决办法
1017
查看次数

球拍来源和/或食谱示例

Racket用Racket写了多少?例如,argmax功能是在Racket还是在C中实现的?接下来怎么样?我在github的源代码中找不到它.

我之所以要问的是,作为一个Scheme/Racket新手,尝试尽可能多地优雅的Racket代码的源代码将非常有用,以便掌握功能/递归最佳实践.当然,如果一切都主要用C实现,那么对我来说这不是正确的方向.

或者,是否有一个"cookbook"或"examples"页面在线显示如何重新创建Racket中的许多内置插件,类似于"my-map"和"my-length"?

谢谢.

racket

10
推荐指数
2
解决办法
2897
查看次数

设置Racket Geiser Emacs路径

我试图让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的这个属性.

谢谢你的帮助.

emacs racket geiser

10
推荐指数
1
解决办法
2776
查看次数

Scheme/Racket最佳实践 - 递归与可变累积

我是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)

recursion scheme accumulator racket

9
推荐指数
1
解决办法
1744
查看次数

在Clojure中通过"窗口"谓词对seq进行分区

我希望将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)

clojure

9
推荐指数
1
解决办法
1039
查看次数

Postgres pgpass windows - 不工作

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提示符下注入密码,这也可以.

谢谢.

postgresql

8
推荐指数
5
解决办法
2万
查看次数

C#中的高性能文件复制?

我有一个大约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()的东西只是语法糖.

c# performance file-copying

7
推荐指数
2
解决办法
2925
查看次数

C#线程/锁定混乱

我有以下代码:

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个项目都会成功写入.

不知道为什么会这样?

谢谢你的帮助.

c# multithreading locking

6
推荐指数
1
解决办法
1924
查看次数

Postgres插入优化

我有一个脚本,通过自定义ORM生成数万个插入到postgres数据库中.你可以想象,它很慢.这用于开发目的,以便创建虚拟数据.我可以在Postgres级别进行简单的优化,以加快速度吗?它是唯一一个按顺序运行的脚本,并且不需要线程安全.

也许我可以关闭所有锁定,安全检查,触发器等?只是寻找一个快速而肮脏的解决方案,这将大大加快这一过程.

谢谢.

sql postgresql bulkinsert

6
推荐指数
3
解决办法
4918
查看次数

Datomic查询和懒惰

当实体出现时,我很惊讶地发现datomic中的查询结果并不是懒惰的.

我错过了这个选择有明显的理由吗?有人可能想要这个似乎是合理的(映射some-fn(包含100个查询结果包含数百万)),但这会强制评估整个实体ID组,不是吗?

有没有办法直接从查询中获取一个懒惰的seq(实体-id),或者它们是否总是必须首先加载到内存中,只有通过实体可用的懒惰?

clojure lazy-evaluation datomic

6
推荐指数
1
解决办法
685
查看次数