我正在 Racket 中基于一个不小的语法(这是 Python 语法!有趣。)生成一个 LL(1) 解析表,并且我想将其写入一个文件。然而,它还没有写出全部内容(大约 77kb)。我想也许我遇到了某种行长度限制,所以我尝试了 pretty-print 并遇到了同样的问题。
这是一个小例子,它将列表中的一堆垃圾写入文件,这次由于某种原因停在 ~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)
如果我将“write”更改为“pretty-write”(以便添加换行符),那么我会丢失 21 次迭代,因此看起来我确实遇到了某种限制。如果有人能帮助我弄清楚这个限制是什么以及如何让我的整个表写入文件,我将不胜感激。我使用的是 Windows,这可能是相关的。
最佳答案
我无法重现您的问题:
(with-output-to-file "/tmp/writetest.rkt"
(λ ()
(write (make-list 3000))))
这会产生一个大约 228KB 的文件。读回来给我3000 元素,这意味着它们都在那里:
(length (with-input-from-file "/tmp/writetest.rkt" read))
我不禁注意到,在您的示例中,您从未使用 close-output-port
关闭 out
端口。也许最后 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 上的 EMACS 使用命令行版本的 Racket 进行的。 DrRacket 中默认有内存消耗限制。
关于file-io - Racket 中的文件输出有最大长度吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28977570/