使用python和pytables处理一个巨大的文件

时间:2013-12-03 20:50:18

标签: python performance pytables

简单的问题,但也许是棘手的答案:

问题是如何使用pytables处理一个巨大的.txt文件。

我有一个很大的.txt文件,有数百万行,短行,例如:

line 1  23458739
line 2  47395736
...........
...........

这个.txt的内容必须保存到pytable中,好吧,这很容易。与txt文件中的信息无关,只需复制到pytables中,现在我们有一个pytable,例如10列和数百万行。

当使用txt文件中的内容,在paytable BUT中直接生成10列x百万行时,问题出现了,具体取决于.txt文件每行的数据,必须在pytable。那么如何有效地处理这个?

解决方案1:首先将所有文本文件逐行复制到pytable(数百万),然后迭代pytable上的每一行(再次数百万),并根据值生成pytable所需的新列。

解决方案2:逐行读取.txt文件,执行任何操作,计算新需要的值,然后将所有信息发送到pyrtable。

解决方案3:.....任何其他有效且更快的解决方案???

1 个答案:

答案 0 :(得分:1)

我认为这里的基本问题是概念模型之一。 PyTables的表只处理常规(或结构化)数据。但是,您拥有的数据是不规则的或非结构化的,因为在读取数据时确定结构。换句话说,PyTables需要在调用create_table()时完全知道列描述。没有办法解决这个问题。

因为在你的问题陈述中,任何一行都可能添加一个新列,你别无选择,只能通过两次完整的数据传递:(1)读取数据并确定列和(2)将数据写入桌子。在伪代码中:

import tables as tb
cols = {}

# discover columns
d = open('data.txt')
for line in d:
    for col in line:
        if col not in cols:
            cols['colname'] = col

# write table
d.seek(0)
f = tb.open_file(...)
t = f.create_table(..., description=cols)
for line in d:
    row = line_to_row(line)
    t.append(row)

d.close()
f.close()

显然,如果你提前知道表结构,你可以跳过第一个循环,这会更快。