2017-02-01 25 views
2

我有一个文本文件,我需要存储在一个列表中。将文件的内容放入列表中?

FILE:

1 1 
4 2 
9 10 

我想有对象的列表。 L = [obj obj obj]

CODE:

def putInList(pathToFile): 
    myList = [] 
    with open(pathToFile) as f: 
     for line in f: 
      s = line.split() 
      x, y = [int(v) for v in s] 
      jemand = Mensch(x, y) 
      myList.append(jemand) 
    return myList 

这工作得很好! 我的问题是我访问磁盘存储器行数倍!

而这个样本是人为的,我将使用更大的文件。所以我写了一个切片机,把它们放到~100MB.txt文件中。所以我想把它们放入list而不需要访问disk memory万次。

搜索和其他问题上的StackOverflow后,我发现这段代码:

a = open(fileToPath, 'r') 
L = [line for line in a.readlines()] 

但我不知道如何分析一个列表?

+1

你的假设是错误的,你会不会接盘内存$行倍。缓冲交易。别担心,我已经遍历了几千兆字节的文件。 – L3viathan

+0

@ L3viathan,只有解析一个100MB的文件需要15分钟!这听起来很正常吗? –

+0

我不知道你的'男装'班是做什么的,所以我不知道究竟是什么瓶颈。但是,如果将所有内容都放在RAM中,无论如何将文件分成几部分并不会有帮助。有关更多建议请参阅我的答案。 – L3viathan

回答

2

你的假设是错误的,你将不会访问磁盘内存$行次数。缓冲交易。

虽然我可以提出一些建议。你的线路分路逻辑比它需要的更复杂。使得它(在我看来)更清晰,是做的一个办法:

x, y = map(int, line.split()) 

这样,你不要无谓地创建一个随即丢弃的名单。

如果以后通过myList迭代,只有做一次,你可以完全删除列表,并使用生成器函数:

def putInList(pathToFile): 
    with open(pathToFile) as f: 
     for line in f: 
      x, y = map(int, line.split()) 
      yield Mensch(x, y) 

然后,您可以遍历它使用for mensch in putInList(filename):了,虽然你可能想在这种情况下重命名该函数。如果你仍然需要一个列表,我会这样做,并使用myList = list(putInList(filename))获得列表。

+0

我现在没有做任何事情,只是在mensch ..只是解析并保存在对象列表中的100MB'文件,它使我疯狂,为什么它需要15-20分钟〜。 –

+0

对于10MB,它从3分钟下降到2:30,所以一个小的加速。我现在将使用'map(int,line.split())'。但是我只是无法看到任何地方需要多长时间...... –

+0

如果一行中平均有两个2位数字,那么每行有6个字节,这意味着大约有1700万个对象 - 包括Python对象的开销很可能会转化为RAM中更多的数据。我写了适合你的规范的最简单的'Mensch'类,一个对象在RAM中需要32个字节。这已经超过500 MB。 – L3viathan

0

readLines()returns a list of the lines默认情况下在您的文本文件中。所以,我认为你应该做的是:

def putInList(pathToFile): 
    myList = [] 
    fileHandle = open(pathToFile, "r") 
    lines = fileHandle.readLines() 
    for line in lines: 
     values = line.split() 
     x, y = [int(v) for v in values] 
     jemand = Mensch(x, y) 
     myList.append(jemand) 
    return myList 
相关问题