【问题标题】:Search in two dimensional array in Python在 Python 中搜索二维数组
【发布时间】:2013-02-01 00:58:45
【问题描述】:

我希望能够通过 Python 在给定两个或多个参数的情况下检索大型数据集(9M 行,1.4 GB)中的特定行。

例如,来自这个数据集:

ID1 2   10  2   2   1   2   2   2   2   2   1

ID2 10  12  2   2   2   2   2   2   2   1   2

ID3 2   22  0   1   0   0   0   0   0   1   2

ID4 14  45  0   0   0   0   1   0   0   1   1

ID5 2   8   1   1   1   1   1   1   1   1   2

给定示例参数:

  • 第二列必须等于 2,并且
  • 第三列必须在一个 范围从 4 到 15

我应该得到:

ID1 2   10  2   2   1   2   2   2   2   2   1

ID5 2   8   1   1   1   1   1   1   1   1   2

问题是我不知道如何在 Python 中有效地对二维数组进行这些操作。

这是我尝试过的:

line_list = []

# Loading of the whole file in memory
for line in file:
    line_list.append(line)

# set conditions
i = 2
start_range = 4
end_range = 15

# Iteration through the loaded list and split for each column
for index in data_list:
    data = index.strip().split()
    # now test if the current line matches with conditions
    if(data[1] == i and data[2] >= start_range and data[2] <= end_range):
        print str(data)

我想多次执行这个过程,但我这样做的方式真的很慢,即使数据文件加载到内存中也是如此。

我正在考虑使用 numpy 数组,但我不知道如何在给定条件下检索行。

感谢您的帮助!

更新:

按照建议,我使用了关系数据库系统。 我选择了 Sqlite3,因为它非常易于使用且部署迅速。

我的文件通过 sqlite3 中的导入函数在大约 4 分钟内加载完毕。

我在第二列和第三列做了索引,以加快检索信息的过程。

查询是通过 Python 完成的,使用模块“sqlite3”。

这样,更快!

【问题讨论】:

  • 你考虑过使用数据库吗?
  • 这看起来像是关系数据库的工作。
  • 好点,我没想到。当我在集群上工作时,我仍然可以拆分文件进行处理。我只是想确定它不能在纯 Python 中有效地完成。

标签: python arrays search


【解决方案1】:

我会选择你所拥有的(未经测试):

with open('somefile') as fin:
    rows = (line.split() for line in fin)
    take = (row for row in rows if int(row[1] == 2) and 4 <= int(row[2]) <= 15)
    # data = list(take)
    for row in take:
        pass # do something

【讨论】:

  • 这将最小化内存开销,但不一定是速度。速度慢的根本原因是 IO 和字符串解析,而不是行搜索。您应该集中精力通过使用 mmap(一种解析速度更快的文件(二进制或固定记录长度))或将数据集放入某种数据库来加快 IO。
  • @FrancisAvila 我不会争辩说这样的东西应该在具有适当索引的数据库中。但是,对于纯磁盘 IO(缺少 mmap'ing,我从未见过在效率方面对文件的简单顺序访问有帮助),这可能是最好的。
  • 这更像是对 OP 的说明,而不是对您的回答的批评,这是非常有针对性的。我警告他不要期待奇迹,除非他能改进他的 IO/解析故事。
  • @FrancisAvila 我的评论也更多地针对 OP,而不是真正针对您自己。我同意,这是一个 IO 问题......而且使用 RDMS 的 load file 或类似的东西将它粉碎成一个简单的表,索引它,然后如果需要从 Python 查询它肯定不会有什么坏处
  • 好的,所以 IO 是瓶颈。感谢您的回复!
猜你喜欢
  • 2021-06-22
  • 2015-07-12
  • 1970-01-01
  • 2023-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-12
  • 1970-01-01
相关资源
最近更新 更多