List 如何将一个巨大的文件加载到Racket中的字符串或列表中?
我有一个巨大的文件,我需要对其进行操作。大约五十万字 我只是想把它读入一个列表或字符串中,以便以后可以用它做一些事情 我还知道我可以使用file->string或者使用file->list,file->line将其加载到字符串中,但是这些似乎花费了waayy太长的时间 这是将其加载到列表中的正确方法吗List 如何将一个巨大的文件加载到Racket中的字符串或列表中?,list,functional-programming,scheme,racket,List,Functional Programming,Scheme,Racket,我有一个巨大的文件,我需要对其进行操作。大约五十万字 我只是想把它读入一个列表或字符串中,以便以后可以用它做一些事情 我还知道我可以使用file->string或者使用file->list,file->line将其加载到字符串中,但是这些似乎花费了waayy太长的时间 这是将其加载到列表中的正确方法吗 (define my-list (with-input-from-file "myFile.txt" read)) 每当我运行我的程序,我只是得到第一行打印出来。不过,它似乎适用于较小的文件。我
(define my-list (with-input-from-file "myFile.txt" read))
每当我运行我的程序,我只是得到第一行打印出来。不过,它似乎适用于较小的文件。我假设50万字,意味着您的文件大约为5 GB 如果是这样的话,你真的不想把整件事都记在记忆里。我的意思是,当然,从技术上讲,整个过程将适合许多计算机的RAM(虽然肯定不是全部),但也需要一段时间才能完成。对于SSD,这将需要大约10秒,我想这是可以的,取决于你的应用程序,它可能是100%的好,但它肯定不是标准桌面应用程序的速度。但是,如果您是从HDD读取,则需要60秒的时间。这是假设你的硬盘没有分割文件,如果是这样,它会更慢 这两种情况都是理想的最小值,实际上,将一个5GB的文件完全加载到RAM中充其量也会很慢。(尽管在某些非常罕见的情况下,这是您想要的,通常是在您从事高性能计算工作时。) 正如@Carcigenicate所建议的,一个更好的方法是将文件惰性地流式传输到程序中,这样就不需要长时间的暂停。为此,我建议您选择或。这两种方法都会生成流,然后您可以使用它们来处理数据,其中第一种方法每次提供一个字节,另一种方法每次提供一行字节。直到你到达EOF。你可以在短时间内完成这项工作 上面的示例是一种计算文件中字节数的缓慢方法。但它显示了如何在输入端口字节中使用
还有其他函数可以从文件中创建字符流而不是字节流:行中的,读取端口
,等等。我强烈感觉到您的问题不是读取字符串,而是打印出来
具体来说,读取这种大小的文件似乎需要大约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毫秒
请注意,因为我将文件->字符串
包装在定义
中,所以我没有打印整个内容。那要花很长时间。你可能应该懒洋洋地读它。你真的需要一次将整个文件存储在内存中吗?5GB?这意味着每个单词平均有10737.4个字符,包括中间的空格。出于某种原因,我的大脑将其解读为5亿……但是,是的,在半个离子交易的情况下,整个事情更合理一些。
cpu time: 30 real time: 30 gc time: 17