将大文件读入字符串行OCaml

lll*_*lll 6 ocaml filereader

我基本上试图将一个大文件(大约10G)读入一个行列表.该文件包含一个整数序列,如下所示:

0x123456
0x123123
0x123123
..... 
Run Code Online (Sandbox Code Playgroud)

我使用下面的方法默认为我的代码库读取文件,但事实证明在这种情况下退出缓慢(~12分钟)

let lines_from_file (filename : string) : string list =                                                                                                                                                                                                                                                                                                                       
    let lines = ref [] in                                                                                                                                                                               
 let chan = open_in filename in                                                                                                                                                                      
  try                                                                                                                                                                                                 
      while true; do                                                                                                                                                                                    
       lines := input_line chan :: !lines                                                                                                                                                              
     done; []                                                                                                                                                                                          
  with End_of_file ->                                                                                                                                                                                 
     close_in chan;                                                                                                                                                                                    
     List.rev !lines;;        
Run Code Online (Sandbox Code Playgroud)

我想我需要将文件读入内存,然后将它们分成几行(我使用的是128G服务器,因此内存空间应该没问题).但是我仍然不明白OCaml这里搜索文件后是否提供这样的设施.

所以这是我的问题:

  1. 鉴于我的情况,如何快速将文件读入字符串列表?

  2. 怎么用stream?但我需要调整相关的应用程序代码,这可能会导致一些时间.

ivg*_*ivg 7

首先,您应该考虑是否真的需要在记忆中同时获取所有信息.也许最好逐行处理文件?

如果你真的想拥有这一切在内存中一次,那么你可以使用Bigarraymap_file功能到一个文件映射为字符数组.然后用它做点什么.

此外,正如我所见,此文件包含数字.也许最好是按顺序分配数组(或者更好的是一个bigarray)和每一行的进程,并在(大)数组中存储整数.