【问题标题】:Best way to handle large data in c++? [closed]在 C++ 中处理大数据的最佳方法是什么? [关闭]
【发布时间】:2014-03-12 09:25:31
【问题描述】:

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

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

我在考虑 SQL,但我不知道那是不是最好的方法。

提前致谢! :)

更新:谢谢各位!我想我会选择一个矢量。并且感谢澄清 30k 不是那么大^^ 对我来说,从来没有处理过如此大量的数据,它看起来相当大;)

【问题讨论】:

  • 从来没有最好的方法。只有最适合的方式。
  • 我认为这不是很多数据。只需将它们存储在向量中,确保shrink_to_fit 向量。如果有很多重复的 name/category 字符串,请使用享元。在id 上对它们进行排序以进行快速搜索。也许使用迭代器容器并将其排序在category 或任何对此进行快速搜索的东西。
  • 而且 30k 个元素似乎不是很大的对象^^
  • 是内存中的临时存储(在这种情况下,我可能会使用 Boost.MultiIndex 之类的东西,或者只是将一些东西与矢量和地图拼凑在一起)还是持久存储(在这种情况下,数据库可能是最好的选择 - 我喜欢sqlite,但还有很多其他的)?

标签: c++ sql large-data


【解决方案1】:

std::vector听起来像是一个完美的结合。如果你事先知道你有多少个元素得到,使用vector::reservevector::resize不overallocate。否则,使用vector::shrink_to_fit许多插入的后 P>

要在@ 987654325加快搜索@,排序vector它并使用binary_search/lower_bound P>

如果您有大量内容相同的字符串,使用轻量级类。这也可以基本上加快字符串比较。 P>

要快速搜索串上迭代器成员到您的容器,得到了vector和整理那些或去boost::multi_index。 P>

一个小的计算来备份,高达:假设int是4个字节,你的字符串平均20个字母,30个000个元素,使得大约为2兆字节。没什么操心。 P>

【讨论】:

    【解决方案2】:

    30.000 个对象并不是一个“非常大的数字”。只要对象本身不是几 kB 的大小,整个集合应该仍然很容易放入 RAM,所以真的没有理由仅仅因为大小而使用数据库。

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

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

    【讨论】:

      【解决方案3】:

      一些 SQL 数据库可能会很好。 30k 不是一个“很大的数字”,是什么让你觉得它是?

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

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 这里为什么可以?
        • 您认为存储 30K 对象的最佳方式是什么?您想通过将它们全部存储在 exe 本身中来使程序崩溃吗?
        • 30k 类型的 OP 对象实际上什么都不是。获得数据库的唯一原因是持久性,即使这样,手动编码序列化也会更快、更轻松。
        • 那么是什么让您认为使用 SQLite 文件是一项麻烦且速度较慢的任务?你应该鼓励最佳实践而不是简单的实践,对吧?
        • 是的,我相信如果您所做的只是处理一个小的同类对象集合,那么依赖数据库并不是一个好习惯。
        【解决方案5】:

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

        【讨论】:

        • 你为什么这么认为?
        • 那么 std::vector 呢?
        猜你喜欢
        • 2015-01-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-30
        • 1970-01-01
        • 1970-01-01
        • 2013-07-02
        • 1970-01-01
        相关资源
        最近更新 更多