传递大数据向量的更好方法

Posted

技术标签:

【中文标题】传递大数据向量的更好方法【英文标题】:Better way to pass vector of LargeData 【发布时间】:2013-12-02 19:36:40 【问题描述】:

需要设计一个函数来返回一个BigClass的数组。为了防止不必要的复制,我有两种选择。

struct BigClass

    int manyfields;    
;

boost::shared_ptr<vector<BigClass> > Fun1()

    throw;


vector<boost::shared_ptr<BigClass> > Fun2()

    throw;

问题> 哪种方法是更好的选择?如果以上都不好,请提供更好的。

谢谢

【问题讨论】:

返回引用不是一种选择吗? (std::vector&lt;BigClass&gt;&amp; func(void);) :v 可以用c++11移动语义吗? VS2010 有移动语义 AFAIK 无论如何都可以省略副本。如果在BigClass 的复制构造函数中没有一些可见的副作用来测试并查看发生了什么,就无法确定。 (就像向控制台打印一条消息) en.wikipedia.org/wiki/Return_value_optimization 【参考方案1】:

VS2010 允许您使用移动语义。

这意味着:std::vector&lt;BigClass&gt; retBigVector() return std::vector&lt;BigClass&gt;(); 可以正常工作。 retBigVector 将构造一个大向量并将其移动到您希望的任何位置。

这是移动语义出现的主要原因之一 - VS2010 再次支持这一点。

【讨论】:

很高兴看到你重返职场,+1【参考方案2】:

没有返回值优化,boost::shared_ptr&lt;vector&lt;BigClass&gt; &gt; 的开销比vector&lt;boost::shared_ptr&lt;BigClass&gt; &gt; 少。第一个复制一个指针,第二个复制向量内的 N 个共享指针。

另外,第二种形式的缓存/内存一致性较低。每个 BigClass 都在堆上单独分配,其中与第一种形式一样,所有的 BigClass 都在一个连续的块中。

【讨论】:

那个大的连续块可能是个问题。如果内存碎片化,分配大量空间可能会很困难。如果BigClass 足够大,使用共享指针向量而不是指向向量的共享指针可能更容易(在内存方面)。您必须分析您的应用程序以确定哪个更好。 另外,复制一个共享指针包括复制至少一个指针,通常是第二个(对于weakrefs)和原子地增加引用计数。其余的:良好的观察。【参考方案3】:

shared_ptr > 需要更少的内存,尤其是对于大向量; vector > 更灵活,因为它允许对内存有意识的矢量操作,例如添加/删除元素或排序。

如果您的矢量大小可控,我会选择 Fun2。如果您的向量很大,并且您确信返回的向量将用于只读,请使用 Fun1。

【讨论】:

【参考方案4】:

试试 boost::vector_ptr: http://www.boost.org/doc/libs/1_55_0/libs/ptr_container/doc/ptr_vector.html

然后您可以通过通常的 [] 运算符获取指针。许多其他 ptr_containers 可用。

【讨论】:

以上是关于传递大数据向量的更好方法的主要内容,如果未能解决你的问题,请参考以下文章

c ++将大向量作为输出传递

大数据信号分析:存储和查询信号数据的更好方法

大数据-10-Spark入门之支持向量机SVM分类器

R - 大数据 - 向量超出向量长度限制

C#使用词嵌入向量与向量数据库为大语言模型(LLM)赋能长期记忆实现私域问答机器人落地

数据嗨客 | 第5期:支持向量机