3

我有一个包含大约 7400 万行的数据表,我使用 blaze 来加载它。

from blaze import CSV, data  
csv = CSV('train.csv')
t = data(csv)

它具有以下字段:A、B、C、D、E、F、G

由于这是一个如此大的数据框,我如何有效地输出符合特定条件的行?例如,我想要具有 A==4、B==8、E==10 的行。有没有办法多任务查找?例如,通过线程或并行编程之类的?

通过并行编程,我的意思是,例如,一个线程将尝试从第 1 行到第 100000 行查找匹配行,第二个线程将尝试从第 100001 行到第 200000 行查找匹配行,依此类推......

4

1 回答 1

1

您的选择标准非常简单:

t[(t.A == 4) & (t.B == 8) & (t.E == 10)]

以现成的iris样本数据集为例:

from blaze import data
from blaze.utils import example
iris = data(example('iris.csv'))

iris[(iris.sepal_length == 7) & (iris.petal_length > 2)]
    sepal_length  sepal_width  petal_length  petal_width          species
50             7          3.2           4.7          1.4  Iris-versicolor

文档讨论了 Blaze 中的并行处理

请注意,只能对可以以非串行方式轻松拆分的数据集进行并行化。特别是不能对单个 CSV 文件进行并行计算。CSV 文件的集合和 HDF5 和 BColz 等二进制存储系统都支持多处理。

显示使用多处理时单个 csv 文件的时间大致相同:

import multiprocessing
pool = multiprocessing.Pool(4)

%timeit -n 1000 compute(iris[(iris.sepal_length > 7) & (iris.petal_length > 2)], 
                        map=pool.map)
1000 loops, best of 1: 12.1 ms per loop

%timeit -n 1000 compute(iris[(iris.sepal_length > 7) & (iris.petal_length > 2)])
1000 loops, best of 1: 11.7 ms per loop
于 2016-08-22T19:31:05.300 回答