Performance 如何有效地逐行阅读球拍中的输入?

Performance 如何有效地逐行阅读球拍中的输入?,performance,functional-programming,scheme,racket,processing-efficiency,Performance,Functional Programming,Scheme,Racket,Processing Efficiency,我目前使用以下逐行读取文件的方法: (for [(line (in-lines))] 但是,现在我的代码太慢了。有没有更快的方法逐行读取输入?像ramrunner一样,我怀疑问题出在其他地方。下面是我编写的一个简短程序,它生成一个10兆字节的文本文件,然后使用“in-line”读取它 #lang racket (define chars (list->vector (string->list "abcde "))) (define charslen (vector-length

我目前使用以下逐行读取文件的方法:

(for [(line (in-lines))]

但是,现在我的代码太慢了。有没有更快的方法逐行读取输入?

像ramrunner一样,我怀疑问题出在其他地方。下面是我编写的一个简短程序,它生成一个10兆字节的文本文件,然后使用“in-line”读取它

#lang racket

(define chars (list->vector (string->list "abcde ")))
(define charslen (vector-length chars))

(define (random-line)
  (list->string
   (for/list ([i (in-range 80)])
     (vector-ref chars (random charslen)))))

(define linecount (ceiling (/ (* 10 (expt 10 6)) 80)))

(time
 (call-with-output-file "/tmp/sample.txt"
   (λ (port)
     (for ([i (in-range linecount)])
       (write (random-line) port)))
   #:exists 'truncate))

;; cpu time: 2512 real time: 2641 gc time: 357

;; okay, let's time reading it back in:

(time
 (call-with-input-file "/tmp/sample.txt"
   (λ (port)
     (for ([l (in-lines port)])
       'do-something))))

;; cpu time: 161 real time: 212 gc time: 26
;; cpu time: 141 real time: 143 gc time: 23
;; cpu time: 144 real time: 153 gc time: 22
这里的时间都以毫秒为单位。因此,读入一个10兆字节文件中的所有行大约需要六分之一秒


这和你看到的相符吗?

像ramrunner一样,我怀疑问题出在其他地方。下面是我编写的一个简短程序,它生成一个10兆字节的文本文件,然后使用“in-line”读取它

#lang racket

(define chars (list->vector (string->list "abcde ")))
(define charslen (vector-length chars))

(define (random-line)
  (list->string
   (for/list ([i (in-range 80)])
     (vector-ref chars (random charslen)))))

(define linecount (ceiling (/ (* 10 (expt 10 6)) 80)))

(time
 (call-with-output-file "/tmp/sample.txt"
   (λ (port)
     (for ([i (in-range linecount)])
       (write (random-line) port)))
   #:exists 'truncate))

;; cpu time: 2512 real time: 2641 gc time: 357

;; okay, let's time reading it back in:

(time
 (call-with-input-file "/tmp/sample.txt"
   (λ (port)
     (for ([l (in-lines port)])
       'do-something))))

;; cpu time: 161 real time: 212 gc time: 26
;; cpu time: 141 real time: 143 gc time: 23
;; cpu time: 144 real time: 153 gc time: 22
这里的时间都以毫秒为单位。因此,读入一个10兆字节文件中的所有行大约需要六分之一秒


这和你看到的相符吗?

你好。你能发布一些关于它有多慢以及你期望它是什么的信息吗?你只是在加载文件还是在打印什么?因为那可能是罪魁祸首。最后,您可以使用其他一些函数来缓冲内容,而不是逐行缓冲。例如,您可以在内存中读取整个内容(如果合适),然后将其拆分,或者按块大小读取并拆分,等等。你能发布一些关于它有多慢以及你期望它是什么的信息吗?你只是在加载文件还是在打印什么?因为那可能是罪魁祸首。最后,您可以使用其他一些函数来缓冲内容,而不是逐行缓冲。例如,您可以在内存中读取整个内容(如果合适),然后将其拆分,或者按块大小读取并拆分,等等。查看一个很好的示例。我改变了random line来构建字符串80λI vector ref chars random charslen,以获得一点速度提升。很好的例子。我改变了random line来构建字符串80λI vector ref chars random charslen,以获得一点速度提升。