Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 如何将一个巨大的文件加载到Racket中的字符串或列表中?_List_Functional Programming_Scheme_Racket - Fatal编程技术网

List 如何将一个巨大的文件加载到Racket中的字符串或列表中?

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)) 每当我运行我的程序,我只是得到第一行打印出来。不过,它似乎适用于较小的文件。我

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

我只是想把它读入一个列表或字符串中,以便以后可以用它做一些事情

我还知道我可以使用file->string或者使用file->list,file->line将其加载到字符串中,但是这些似乎花费了waayy太长的时间

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

(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