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 中,默认情况下存在内存消耗限制。