使用Blaze包查找特定行的有效方法?

时间:2016-08-22 19:04:26

标签: python multithreading pandas parallel-processing blaze

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

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行到第100行找到匹配的行,第二个线程将尝试从行100001到200000找到匹配的行,依此类推......

1 个答案:

答案 0 :(得分: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中讨论parallel processing

  

请注意,只能在可以以非串行方式轻松拆分的数据集上进行并行化。特别是,不能在单个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