2015-05-05 47 views
2

我有20333個文件一起製作93M,每個文件可以在136b和956K之間加權。我需要閱讀這些製表符分隔的文件中的數據(* .tsv格式)閱讀一個大文件vs打開數千個文件

我正在考慮追加他們在一個文件中(以避免打開和關閉文件),而我從FTP服務器上下載。
打開和讀取我用下面的功能的任何文件:

def read_file(file_): 
    with open(file_) as f: 
     for line in f: 
      yield line.split("\t") 

難道是提高性能的好主意嗎?

+2

我想只要你的記憶可以讓你一次加載它們,這應該不成問題。當你正在運行的程序由於更大的文件大小以及你在程序中使用文件內容所做的一切時,它只會開始提出問題 – hallole

+0

在這種情況下文件大小無關緊要,因爲你從未讀過整個文件。遍歷文件的內存效率高,速度快,不會導致內存問題。 – miindlek

+2

做的「正義」18M是指所有文件的總大小一起還是指每個文件的大小?如果這些文件總共爲18M,我會在下載它們時將它們附加在一起。這似乎更容易... – WWhisperer

回答

1

是的,將內容連接到單個文件將提高性能 - 如果沒有其他原因,因爲這將允許內容被流水線化。

檢索一系列文件需要請求/響應對一個顯著號碼;當服務器正在等待來自客戶端的新命令時,否則可能會使用的帶寬被浪費,除非增加了顯着的複雜性和邏輯以避免這種情況(例如運行多個併發FTP連接)。

相比之下,獲取了大量文件允許,直到它從客戶端的ACK丟失,服務器不斷地發送內容(告訴它慢下來)。這將導致更好的吞吐量。

+0

關於多個併發FTP的好處。由於時間不夠,我的ftp連接關閉了。 – Llopis

0

我覺得傢伙有回答你的問題在效率方面。我只想補充以下內容:

要打開並從一個目錄/文件夾,你可以用下面的下面的代碼讀取文件。 希望這是一些幫助。

import glob 
output = r"path\to\file\i\want\to\write\too\output.txt" 
with open(output, 'w') as outfile: 
    for file_name in glob.glob("/path/to/folder/containing/files/*.txt"): 
     with open(file_name) as infile: 
      outfile.write(infile.read()) 
+0

謝謝,但我會從ftp服務器下載它們,而不是一次下載。歡迎來到堆棧溢出! – Llopis

+0

@Antwane謝謝! –