Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用python和pytables处理大型文件_Python_Performance_Pytables - Fatal编程技术网

使用python和pytables处理大型文件

使用python和pytables处理大型文件,python,performance,pytables,Python,Performance,Pytables,简单的问题,但可能是棘手的答案: 问题是如何用pytables处理一个巨大的.txt文件 我有一个大的.txt文件,有数百万行,短行,例如: line 1 23458739 line 2 47395736 ........... ........... txt的内容必须保存到pytable中,好的,很简单。与txt文件中的信息无关,只需复制到pytables中,现在我们有了一个pytable,例如,有10列和数百万行 当txt文件中的内容在paytable中直接生成10列x数百万行时,就会

简单的问题,但可能是棘手的答案:

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

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

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

当txt文件中的内容在paytable中直接生成10列x数百万行时,就会出现问题,但根据.txt文件每行上的数据,必须在pytable上创建新列。那么如何有效地处理这个问题呢

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

解决方案2:逐行读取.txt文件,做任何需要的事情,计算新的需要的值,然后将所有信息发送到表中


解决方案3:……还有其他更有效、更快的解决方案吗?

我认为这里的基本问题是概念模型之一。PyTables的表仅处理常规(或结构化)数据。但是,您拥有的数据是不规则的或非结构化的,因为结构是在您读取数据时确定的。换句话说,PyTables需要在调用
create\u 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()

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

我认为这里的基本问题是概念模型之一。PyTables的表仅处理常规(或结构化)数据。但是,您拥有的数据是不规则的或非结构化的,因为结构是在您读取数据时确定的。换句话说,PyTables需要在调用
create\u 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()

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

您尝试过基准测试吗?请注意,基准测试结果可能取决于您执行的操作类型。不,我没有,我不知道如何执行。实际上,我在想,可能有人有类似的问题,也许可以给出建议。很简单,您必须实现这两种解决方案,并根据测试文件对它们进行计时。您尝试过基准测试吗?请注意,基准测试结果可能取决于您执行的操作类型。不,我没有,我不知道如何执行。实际上,我在想,可能有人有类似的问题,也许可以给出建议。很简单,您必须实现这两种解决方案,并根据测试文件对它们进行计时。