Python中并行数组/向量的有效分组
我有一个非常大的根(二进制)格式的数据集,其中包含序列化的std::vector对象。长度为N的每个向量基本上表示N个逻辑对象集合的数据成员(此处,N可能随文件中的每个条目而变化)。例如,对于文件中的每个条目,我读取以下对象:Python中并行数组/向量的有效分组,python,data-structures,root,bigdata,grid-computing,Python,Data Structures,Root,Bigdata,Grid Computing,我有一个非常大的根(二进制)格式的数据集,其中包含序列化的std::vector对象。长度为N的每个向量基本上表示N个逻辑对象集合的数据成员(此处,N可能随文件中的每个条目而变化)。例如,对于文件中的每个条目,我读取以下对象: std::vector<float> foo_a; std::vector<float> foo_b; std::vector<int> foo_c; 在分析之后,我发现创建对象和将数据从向量复制到python对象的所有开销都是处理时
std::vector<float> foo_a;
std::vector<float> foo_b;
std::vector<int> foo_c;
在分析之后,我发现创建对象和将数据从向量复制到python对象的所有开销都是处理时间上的一个重要瓶颈。有没有更有效的方法达到同样的效果
关于优化的危险或更明智的剥猫方法的原则性和明智的建议是受欢迎的,但请记住:1)数据集庞大(高达100 TB);有数百万个条目和数千个不同长度的并行向量(对应于几十个逻辑对象)。2) 我无法控制输入数据的格式
struct Foo {
float a;
float b;
int c;
};
std::vector<Foo> my_foos;
class Dummy:
def __init__(self): pass
def get_objects(list_of_field_names, list_of_parallel_vectors):
names_and_vectors = zip(list_of_field_names, list_of_parallel_vectors)
n = len(list_of_parallel_vectors[0])
for i in xrange(n):
obj = Dummy()
obj_members = [(field_name, vector.at(i))
for field_name, vector in names_and_vectors]
obj.__dict__.update(obj_members)
yield obj
# ...
# get the std::vectors from file:
foo_a, foo_b, foo_c = magic()
# retrieve my python list of Foo objects:
objects_to_process = get_objects( ('a','b','c'), (foo_a, foo_b, foo_c) )
# now I can access logical data in the parallel vectors as a python object:
for obj in objects_to_process:
print (obj.a + obj.b) / obj.c