問題

私は現在、ファイルを1行ずつ読み込む次の方法を使用しています:

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

しかし、今私のコードは遅すぎます。入力を1行ずつ読み込む「より速い」方法はありますか?

  ベストアンサー

ramrunnerのように、私は問題が他の場所にあると思う。ここで私が書いた短いプログラムは、10メガバイトのテキストファイルを生成し、それを 'in-lines'を使って読み込みます。

 #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メガバイトのファイル内のすべての行を読み込むのに約6秒かかります。

これはあなたが見ているものと一致しますか?

  同じタグがついた質問を見る

performancefunctional-programmingschemeracketprocessing-efficiency