2015-05-05 48 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谢谢! –