【问题标题】:How to load a huge file into a String or list in Racket?如何将大文件加载到 Racket 中的字符串或列表中?
【发布时间】:2017-06-21 01:58:39
【问题描述】:

我有一个巨大的文件需要对其进行操作。巨大的大约。半百万字。

我只是想把它读入一个列表或字符串,这样我以后可以用它来做事。

我也知道我可以使用 file->string 或使用 file->list, file->lines 将它加载到一个字符串中,但是这些似乎花费了太长时间。

这是将其加载到列表中的正确方法吗?:

(define my-list (with-input-from-file "myFile.txt" read))

每当我运行我的程序时,我都会打印出第一行。不过似乎适用于较小的文件。

【问题讨论】:

  • 你应该懒惰地阅读它。您真的需要一次将整个文件都保存在内存中吗?

标签: list functional-programming scheme racket


【解决方案1】:

我有一种强烈的感觉,您的问题不是读取字符串,而是打印出来

具体来说,读取这种大小的文件似乎需要我大约 0.03 秒。

我使用这个程序生成了一个文件:

#lang racket

(define str
  "Beebe a reeble to one niner big druppy bonker watz. ")

(with-output-to-file "/tmp/foo.txt"
  (λ ()
    (for ([i (in-range (/ 500000 10))])
      (displayln str))))    

然后,我是这样读的:

#lang racket

(define a (time (file->string "/tmp/foo.txt")))

...并产生了这个输出:

cpu time: 30 real time: 30 gc time: 17

....表示 30 毫秒。

请注意,因为我将 file->string 包裹在 define 中,所以我没有将整个内容打印出来。那将需要很长时间。

【讨论】:

    【解决方案2】:

    我假设按一百万字计算,你的意思是你的文件大约是 5 GB。

    如果是这种情况,您真的不想将整个内容读入内存。我的意思是,当然,从技术上讲,整个东西将适合许多计算机拥有的 RAM(尽管肯定不是全部),但也需要一段时间才能做到。使用 SSD 大约需要 10 秒,我猜这没关系,根据您的应用程序,它可能 100% 没问题,但对于标准桌面应用程序来说肯定不是很快。但是,如果您从 HDD 读取它,则需要 60 秒。这是假设您的硬盘驱动器没有对文件进行碎片整理,如果是这样,它会更慢。

    这两种情况都是理想的最小值,实际上将一个 5 GB 的文件完全加载到 RAM 中充其量是很慢的。 (虽然在极少数情况下这是您想要的,通常是在您进行高性能计算时。)

    正如@Carcigenicate 建议的那样,一个更好的主意是将文件懒惰地流式传输到您的程序中,这样您就不需要长时间的停顿。为此,我推荐in-input-port-bytesin-bytes-lines。它们都生成流,然后您可以使用这些流来处理数据,其中第一个一次给您一个字节,而另一个一次给您一行字节。直到你达到EOF。您可以在for 中执行此操作

    (call-with-input-file "file.txt"
      (lambda (f)
        (for/fold ([counter 0])
                  ([i (in-input-port-bytes f)])
          (+ counter 1))
    

    上面的例子是一种计算文件中字节数的慢速方法。但它显示了如何使用in-input-port-bytes

    还有其他函数可以从文件中创建字符流而不是字节:in-linesread-port 等。

    【讨论】:

    • 5GB?这意味着每个单词平均有 10737.4 个字符,包括中间的空格。
    • 糟糕,你说得对。出于某种原因,我的大脑将其解读为 10 亿....但是,在半个离子交易中,整个事情更合理一些。
    猜你喜欢
    • 2012-01-05
    • 2015-04-05
    • 2019-03-25
    • 1970-01-01
    • 2021-05-25
    • 2016-12-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-15
    相关资源
    最近更新 更多