file-io - Racket 中的文件输出有最大长度吗?

标签 file-io scheme buffer racket

我正在 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/

相关文章:

powershell - Powershell流水线数据到外部控制台应用程序

c++ - 我是否需要定义 ">>"运算符才能将 cin 与 Int32 一起使用?

java - FileReader 和 FileWriter 是否使用内部缓冲区?

java - 搜索文件的内容

scheme - 在 Racket 程序中使用 Scheme 库

lisp - (方案)递归函数来计算某些列表的所有可能组合?

c# - 从方法返回 Lazy<Stream> 是否是推迟打开 FileStream 的成本的好主意?

scheme - 如何在 andmap 中的 lambda 函数中返回值

javascript - 如何将 getUsermedia 音频流转换为 blob 或缓冲区?

delphi - Indy,如何知道所需缓冲区的大小?