2017-02-03 30 views
1

我有一個巨大的文件,我需要做的操作。巨大如約。五十萬字。如何將大文件加載到球拍中的字符串或列表中?

我只想將它讀入列表或字符串中,以便稍後可以對它進行處理。

另外我知道我可以使用文件 - >字符串或使用文件 - >列表,文件 - >行加載到一個字符串,但這似乎需要waayy太長。

這是將其加載到一個列表?:

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

每當我跑我的節目,我剛剛得到的第一行打印出來的正確途徑。似乎適用於較小的文件。

+2

你可能應該懶洋洋地讀它。你是否真的一次需要將整個文件存儲在內存中? – Carcigenicate

回答

0

我打算假設用五十萬字來表示你的文件大約是5GB。

如果是這樣的話,你真的不想把整件事情都讀入記憶中。我的意思是,當然,整個事情在技術上會適合許多計算機擁有的內存(儘管當然不是全部),但它也需要一段時間才能完成。使用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

+0

5GB?這意味着每個單詞平均有10737.4個字符,包括間隔空間。 –

+0

Woops,你是對的。出於某種原因,我的大腦將其讀爲5億美元....但是,在半個離子交易整個事情是更合理一點。 –

0

我有一個強烈的感覺,你的問題不是讀取字符串中,但而是將其印出

具體而言,讀取此大小的文件似乎需要大約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毫秒。

需要注意的是,因爲我在define包裹file->string,我打印整個事情了。這需要很長時間。

相關問題