Racket 中的文件输出是否有最大长度?
Is there a maximum length to file output in Racket?
我在 Racket 中生成一个 LL(1) 解析 table 基于一个不小的语法(这是 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)
如果我将 "write" 更改为 "pretty-write"(以便添加换行符),那么我将错过 21 次迭代,因此看起来我确实达到了某种极限。如果有人能帮我弄清楚这个限制是什么以及如何让我的整个 table 写入文件,我将不胜感激。我在 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 的内存。
试图看看我是否可以将 300 万个列表元素放入一个文件中,我将您的 make-list
重写为生成器并进行了尝试。这意味着我必须连续调用 write
而不是一次调用。在我关闭它之前,该文件是 145MB。
我能够使用 write-char
创建一个 2.3 GB 的文件。我认为没有文件大小限制。
此测试是在 Linux 上通过 EMACS 使用命令行版本的 Racket 进行的。在 DrRacket 中,默认情况下存在内存消耗限制。
我在 Racket 中生成一个 LL(1) 解析 table 基于一个不小的语法(这是 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)
如果我将 "write" 更改为 "pretty-write"(以便添加换行符),那么我将错过 21 次迭代,因此看起来我确实达到了某种极限。如果有人能帮我弄清楚这个限制是什么以及如何让我的整个 table 写入文件,我将不胜感激。我在 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 的内存。
试图看看我是否可以将 300 万个列表元素放入一个文件中,我将您的 make-list
重写为生成器并进行了尝试。这意味着我必须连续调用 write
而不是一次调用。在我关闭它之前,该文件是 145MB。
我能够使用 write-char
创建一个 2.3 GB 的文件。我认为没有文件大小限制。
此测试是在 Linux 上通过 EMACS 使用命令行版本的 Racket 进行的。在 DrRacket 中,默认情况下存在内存消耗限制。