Thanks for you help!

Another question: what is the best scenario for duplicates?
It's normal to have 2-3 millions of duplicates for the same key, when total
number of keys will be around 10000?

Thanks!


---
С уважением,
Киранов Александр

2015-05-06 12:10 GMT+03:00 Howard Chu <[email protected]>:

> James Rouzier wrote:
>
>> Here is a faster to do way to do what you want.
>> Just get the last key of your range and while iterating compare the data
>> pointer of the last key to see if you reach the end instead of the it's
>> content.
>> As long as you are in the same transaction the data pointer of the last
>> key
>> should never change. (Someone correct me if I am wrong).
>>
>
> Right, that will work in a read transaction. In a write transaction, if
> any writes are happening while iterating thru, it's possible for the data
> pointers to change.
>
>
>> Here is a quick example of what I mean.
>>
>>    MDB_cursor *cursor;
>>    MDB_val first_key, key, data;
>>    MDB_val last_key1, last_key2, last_data;
>>    int rc;
>>
>> //Get the last key
>>    rc = mdb_cursor_get (cursor, &last_key1, &last_data, MDB_SET_RANGE);
>>     //If the current position is not equal move back one spot
>>    if (rc == MDB_SUCCESS && mdb_cmp (mdb_cursor_txn (cursor),
>> mdb_cursor_dbi
>> (cursor), &last_key1, &last_key2)) {
>>      rc = mdb_cursor_get (cursor, &last_key1, &last_data, MDB_PREV);
>>    }
>>    //This means that nothing is equal or greater than the last key or the
>> last
>> key is at the first position
>>    if (rc) {
>>      last_data.mv_data = NULL;
>>    }
>>    //Get the first key
>>    rc = mdb_cursor_get (cursor, &first_key, &data, MDB_SET_RANGE);
>>    if(rc == MDB_SUCCESS) {
>>      do {
>>      } while (mdb_cursor_get (cursor, &key, &data, MDB_NEXT) ==
>> MDB_SUCCESS &&
>> data.mv_data != last_data.mv_data);
>>    }
>>
>>  > Hi all!
>>
>>  > Is there a way to iterate with all key-value pairs in LMDB database,
>> where
>> all keys is in specified range?
>>  > I'm trying to use mdb_cursor_get() with MDB_SET_RANGE to search first
>> pair.
>>  > Then I see only one way - use mdb_cursor_get() with MDB_NEXT and
>> compare
>> key by memcmp().
>>  > But it seems absolutely not effective.
>>  >
>>  > Is there another solution for my task?
>>  >
>>  > Thanks!
>>
>>
>
> --
>   -- Howard Chu
>   CTO, Symas Corp.           http://www.symas.com
>   Director, Highland Sun     http://highlandsun.com/hyc/
>   Chief Architect, OpenLDAP  http://www.openldap.org/project/
>

Reply via email to