在c ++中处理大数据的最佳方法?

时间:2014-02-13 13:13:33

标签: c++ sql large-data

我有大量的物体(大约30k)。存储和访问它们的最佳方法是什么?它们都有一个特定的ID,但我也希望用它们的名称,类别等来过滤和搜索它。它是一个非常简单的类,如下所示:

class objclass {
int id;
std::string name;
...
}

我在想SQL,但我不知道这是不是最好的方法。

提前致谢! :)

更新:Thx Guys!我想我会选择一个矢量。并且thx澄清30k不是那么大^^对我来说,从未处理过如此数量的数据它似乎相当大;)

5 个答案:

答案 0 :(得分:2)

std::vector听起来非常合适。如果您事先知道自己获得了多少元素,请使用vector::reservevector::resize进行全面分配。否则,在大量插入后使用vector::shrink_to_fit

要加快id上的搜索,请对其vector进行排序并使用binary_search/lower_bound

如果您有许多具有相同内容的字符串,请使用flyweight类。这也可以大大加快字符串比较。

要快速搜索字符串成员,请在容器中获取vector个迭代器并对其进行排序或选择boost::multi_index

一个小的计算来支持它:假设int是4个字节,你的字符串平均20个字母,30 000个元素,大约2兆字节。无需担心。

答案 1 :(得分:1)

30.000个对象实际上不是“非常大的数字”。只要对象本身的大小不是几KB,整个集合仍然可以很容易地适应RAM,所以没有理由因为大小而使用数据库。

您可以将它们全部存储在std::vector中。当您需要有效地搜索它们时,您可以为要搜索的每个字段创建std::mapstd::multimap,以便将值映射到对象的引用。

但是,除了数据量之外,还有其他原因可以使用数据库。例如,当您有其他程序(或同一程序的多个实例)对同一数据进行操作并希望在它们之间保持数据同步时。或者当你只想要一个可靠的持久层时。选择哪个数据库真的取决于您。您的要求(就您所写的而言)非常通用,任何数据库系统都应该能够充分处理它们。您的项目可能会有一些方面使某些数据库比其他数据库更合适,但您没有提及任何数据库。

答案 2 :(得分:0)

某些SQL数据库可能会没问题。 30k不是“非常大的数字”,是什么让你认为它是?

除非您的过滤条件非常复杂,否则您也可以考虑将所有内容保存在内存中。那就是如果你不需要某种持久性,但你的要求非常模糊。

所以:如果你想方便我选择SQL,如果速度非常重要我会选择内存版本和自定义过滤器。但这取决于您拥有的数据类型以及许多其他因素。

答案 3 :(得分:-1)

你应该找到最适合你的方式。 SQLite,MySQL数据库可用于C ++的大型数据库需求

答案 4 :(得分:-3)

我认为创建数据库是最好的。