【问题标题】:Problem with Berkeley DB and C++Berkeley DB 和 C++ 的问题
【发布时间】:2009-10-15 13:37:03
【问题描述】:

我正在尝试编写一个使用 Berkeley DB 进行存储的简单 C++ 程序。数据库的key为time_t类型,数据为integer。

我需要在两个键之间获取两个相邻数据之间的差异。我打开一个带有标志 DB_SET_RANGE 的游标,然后我使用 DB_NEXT 进行迭代。

我的问题是光标返回未排序的数据。有没有办法为光标指定自定义排序功能?

【问题讨论】:

    标签: c++ sorting cursor berkeley-db


    【解决方案1】:

    您可能希望提供自定义排序功能的一些原因是:

    您正在使用 little-endian 系统(例如 x86)并且您正在使用整数作为数据库的键。 Berkeley DB 将键存储为字节字符串,而小端整数在被视为字节字符串时不能很好地排序。这个问题有几种解决方案,一种是提供自定义比较功能。请参阅http://www.oracle.com/technology/documentation/berkeley-db/db/ref/am_misc/faq.html 了解更多信息。

    您使用 DB->set_bt_compare() 设置 BTree 的键比较函数。

    例如,用于对数据库中的整数键进行排序的示例例程是:

    int
    compare_int(DB *dbp, const DBT *a, const DBT *b)
    {
        int ai, bi;
    
        /* 
         * Returns: 
         * < 0 if a < b 
         * = 0 if a = b 
         * > 0 if a > b 
         */ 
        memcpy(&ai, a->data, sizeof(int)); 
        memcpy(&bi, b->data, sizeof(int)); 
        return (ai - bi); 
    } 
    

    【讨论】:

      【解决方案2】:

      我认为您必须为您的数据创建一个secondary index。

      我曾尝试过 Sleeping Cat Berkeley 数据库(由于代码维护),但我没有尝试二级索引。
      如果性能不是那么重要并且您可以切换数据库引擎,我推荐SQLite :-)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多