我在Racket中基于一个不小的语法生成一个LL(1)解析表(这是Python语法!很有趣。)我想把它写到一个文件中。然而,它没有写完整件事(它停在大约77kb)。我想也许我正在达到某种线路长度限制,所以我尝试了漂亮的打印并遇到了同样的问题。
这是一个将列表中的一堆垃圾写入文件的小例子,这次由于某种原因它停在~227kb。实际上它只丢失了大约11次迭代,所以最终会发生什么奇怪的事情?
#lang racket
(define (make-list n)
(define (iter i curr)
(if (= i 0) curr
(iter (- i 1)
(cons (format "This is line ========================================================= ~a" i) curr))))
(iter n '()))
(define out (open-output-file "writetest.rkt"))
(write (make-list 3000) out)
如果我将“写入”更改为“漂亮写入”(以便添加换行符),那么我缺少21次迭代,所以看起来我肯定会遇到某种限制。如果有人可以帮我弄清楚这个限制是什么以及如何让我的整个表写入文件,我将不胜感激。我在Windows上可能是相关的。
答案 0 :(得分:3)
我无法重现您的问题:
(with-output-to-file "/tmp/writetest.rkt"
(λ ()
(write (make-list 3000))))
产生大约228KB的文件。读回来给我3000 元素,这意味着他们都在那里:
(length (with-input-from-file "/tmp/writetest.rkt" read))
我无法帮助,但请注意,在您的示例中,您永远不会使用out
关闭close-output-port
端口。也许最后11个元素都在缓冲区中。使用with-output-to-file
会更好,因为即使抛出异常,文件也会关闭。
所以我尝试了(make-list 6000)
并创建了一个456KB的文件。没有证据
文件大小限制。
我用(make-list 3000000)
尝试了你的例子,在我杀死它之前,Racket进程消耗了1.6 GB的RAM。
试着看看我是否可以将300万个列表元素放入文件中,我将make-list
重写为生成器并尝试了。这意味着我必须连续拨打write
而不是一个电话。在关闭它之前,该文件是145MB。
我能够使用write-char
创建一个2.3 GB的文件。我认为没有文件大小限制。
此测试是在Linux上使用命令行版本的Racket通过EMACS进行的。在DrRacket中,默认情况下存在内存消耗限制。