mirror of https://gitee.com/bigwinds/arangodb
less memory usage
This commit is contained in:
parent
f2810fe9fc
commit
fe667646c0
|
@ -49,15 +49,14 @@ static int IndexStaticCopyElementElement (TRI_skiplist_base_t* skiplist,
|
|||
return TRI_ERROR_INTERNAL;
|
||||
}
|
||||
|
||||
leftElement->numFields = rightElement->numFields;
|
||||
leftElement->_document = rightElement->_document;
|
||||
leftElement->_subObjects = TRI_Allocate(TRI_UNKNOWN_MEM_ZONE, sizeof(TRI_shaped_sub_t) * leftElement->numFields, false);
|
||||
leftElement->_subObjects = TRI_Allocate(TRI_UNKNOWN_MEM_ZONE, sizeof(TRI_shaped_sub_t) * skiplist->_numFields, false);
|
||||
|
||||
if (leftElement->_subObjects == NULL) {
|
||||
return TRI_ERROR_OUT_OF_MEMORY;
|
||||
}
|
||||
|
||||
memcpy(leftElement->_subObjects, rightElement->_subObjects, sizeof(TRI_shaped_sub_t) * leftElement->numFields);
|
||||
memcpy(leftElement->_subObjects, rightElement->_subObjects, sizeof(TRI_shaped_sub_t) * skiplist->_numFields);
|
||||
|
||||
return TRI_ERROR_NO_ERROR;
|
||||
}
|
||||
|
@ -258,10 +257,6 @@ static int IndexStaticCompareElementElement (struct TRI_skiplist_s* skiplist,
|
|||
// list entries.
|
||||
// ............................................................................
|
||||
|
||||
if (leftElement->numFields != rightElement->numFields) {
|
||||
assert(false);
|
||||
}
|
||||
|
||||
// ............................................................................
|
||||
// The document could be the same -- so no further comparison is required.
|
||||
// ............................................................................
|
||||
|
@ -272,7 +267,7 @@ static int IndexStaticCompareElementElement (struct TRI_skiplist_s* skiplist,
|
|||
|
||||
shaper = skiplist->base._collection->_shaper;
|
||||
|
||||
for (j = 0; j < leftElement->numFields; j++) {
|
||||
for (j = 0; j < skiplist->base._numFields; j++) {
|
||||
compareResult = CompareElementElement(leftElement,
|
||||
j,
|
||||
rightElement,
|
||||
|
@ -346,12 +341,7 @@ static int IndexStaticCompareKeyElement (struct TRI_skiplist_s* skiplist,
|
|||
// the number of fields that the index is defined with.
|
||||
// ............................................................................
|
||||
|
||||
if (leftElement->numFields < rightElement->numFields) {
|
||||
numFields = leftElement->numFields;
|
||||
}
|
||||
else {
|
||||
numFields = rightElement->numFields;
|
||||
}
|
||||
numFields = skiplist->base._numFields;
|
||||
|
||||
shaper = skiplist->base._collection->_shaper;
|
||||
|
||||
|
@ -409,17 +399,13 @@ static int IndexStaticMultiCompareElementElement (TRI_skiplist_multi_t* multiSki
|
|||
return TRI_SKIPLIST_COMPARE_STRICTLY_EQUAL;
|
||||
}
|
||||
|
||||
if (leftElement->numFields != rightElement->numFields) {
|
||||
assert(false);
|
||||
}
|
||||
|
||||
if (leftElement->_document == rightElement->_document) {
|
||||
return TRI_SKIPLIST_COMPARE_STRICTLY_EQUAL;
|
||||
}
|
||||
|
||||
shaper = multiSkiplist->base._collection->_shaper;
|
||||
|
||||
for (j = 0; j < leftElement->numFields; j++) {
|
||||
for (j = 0; j < multiSkiplist->base._numFields; j++) {
|
||||
compareResult = CompareElementElement(leftElement,
|
||||
j,
|
||||
rightElement,
|
||||
|
@ -474,12 +460,7 @@ static int IndexStaticMultiCompareKeyElement (TRI_skiplist_multi_t* multiSkipli
|
|||
// the number of fields that the index is defined with.
|
||||
// ............................................................................
|
||||
|
||||
if (leftElement->numFields < rightElement->numFields) {
|
||||
numFields = leftElement->numFields;
|
||||
}
|
||||
else {
|
||||
numFields = rightElement->numFields;
|
||||
}
|
||||
numFields = multiSkiplist->base._numFields;
|
||||
|
||||
shaper = multiSkiplist->base._collection->_shaper;
|
||||
|
||||
|
|
|
@ -322,6 +322,7 @@ static int32_t RandLevel (TRI_skiplist_base_t* skiplist) {
|
|||
|
||||
int TRI_InitSkipList (TRI_skiplist_t* skiplist,
|
||||
TRI_primary_collection_t* primary,
|
||||
size_t numFields,
|
||||
TRI_skiplist_prob_e probability,
|
||||
uint32_t maximumHeight) {
|
||||
|
||||
|
@ -333,6 +334,7 @@ int TRI_InitSkipList (TRI_skiplist_t* skiplist,
|
|||
}
|
||||
|
||||
skiplist->base._collection = primary;
|
||||
skiplist->base._numFields = numFields;
|
||||
|
||||
// ..........................................................................
|
||||
// Assign the STATIC comparision call back functions
|
||||
|
@ -1325,6 +1327,7 @@ void* TRI_StartNodeSkipList(TRI_skiplist_t* skiplist) {
|
|||
|
||||
int TRI_InitSkipListMulti (TRI_skiplist_multi_t* skiplist,
|
||||
TRI_primary_collection_t* primary,
|
||||
size_t numFields,
|
||||
TRI_skiplist_prob_e probability,
|
||||
uint32_t maximumHeight) {
|
||||
|
||||
|
@ -1336,6 +1339,7 @@ int TRI_InitSkipListMulti (TRI_skiplist_multi_t* skiplist,
|
|||
}
|
||||
|
||||
skiplist->base._collection = primary;
|
||||
skiplist->base._numFields = numFields;
|
||||
|
||||
// ..........................................................................
|
||||
// Assign the comparision call back functions
|
||||
|
|
|
@ -105,6 +105,8 @@ TRI_skiplist_node_t;
|
|||
typedef struct TRI_skiplist_base_s {
|
||||
struct TRI_primary_collection_s* _collection;
|
||||
|
||||
size_t _numFields;
|
||||
|
||||
// ...........................................................................
|
||||
// The maximum height of this skip list. Thus 2^(_maxHeight) elements can be
|
||||
// stored in the skip list.
|
||||
|
@ -202,6 +204,7 @@ TRI_skiplist_t;
|
|||
|
||||
int TRI_InitSkipList (TRI_skiplist_t*,
|
||||
struct TRI_primary_collection_s*,
|
||||
size_t,
|
||||
TRI_skiplist_prob_e,
|
||||
uint32_t);
|
||||
|
||||
|
@ -362,6 +365,7 @@ TRI_skiplist_multi_t;
|
|||
|
||||
int TRI_InitSkipListMulti (TRI_skiplist_multi_t*,
|
||||
struct TRI_primary_collection_s*,
|
||||
size_t,
|
||||
TRI_skiplist_prob_e,
|
||||
uint32_t);
|
||||
|
||||
|
|
|
@ -472,9 +472,13 @@ static void FillSkiplistIndexKeyBySkiplistIndexElement (SkiplistIndex* idx,
|
|||
size_t n;
|
||||
size_t i;
|
||||
|
||||
key->numFields = element->numFields;
|
||||
if (idx->unique) {
|
||||
n = idx->skiplist.uniqueSkiplist->base._numFields;
|
||||
}
|
||||
else {
|
||||
n = idx->skiplist.nonUniqueSkiplist->base._numFields;
|
||||
}
|
||||
|
||||
n = element->numFields;
|
||||
key->fields = TRI_Allocate(TRI_CORE_MEM_ZONE, n * sizeof(TRI_shaped_json_t), false);
|
||||
|
||||
ptr = (char const*) element->_document->_data;
|
||||
|
@ -605,7 +609,8 @@ void SkiplistIndex_free(SkiplistIndex* slIndex) {
|
|||
/// @brief creates a new unique entry skiplist
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
SkiplistIndex* SkiplistIndex_new (TRI_primary_collection_t* primary) {
|
||||
SkiplistIndex* SkiplistIndex_new (TRI_primary_collection_t* primary,
|
||||
size_t numFields) {
|
||||
SkiplistIndex* skiplistIndex;
|
||||
int res;
|
||||
|
||||
|
@ -626,6 +631,7 @@ SkiplistIndex* SkiplistIndex_new (TRI_primary_collection_t* primary) {
|
|||
|
||||
res = TRI_InitSkipList(skiplistIndex->skiplist.uniqueSkiplist,
|
||||
primary,
|
||||
numFields,
|
||||
TRI_SKIPLIST_PROB_HALF,
|
||||
40);
|
||||
|
||||
|
@ -782,10 +788,10 @@ static bool skiplistIndex_findHelperIntervalValid(SkiplistIndex* skiplistIndex,
|
|||
}
|
||||
|
||||
|
||||
static void SkiplistIndex_findHelper(SkiplistIndex* skiplistIndex,
|
||||
TRI_vector_t* shapeList,
|
||||
TRI_index_operator_t* indexOperator,
|
||||
TRI_vector_t* resultIntervalList) {
|
||||
static void SkiplistIndex_findHelper (SkiplistIndex* skiplistIndex,
|
||||
TRI_vector_t* shapeList,
|
||||
TRI_index_operator_t* indexOperator,
|
||||
TRI_vector_t* resultIntervalList) {
|
||||
TRI_skiplist_index_key_t values;
|
||||
TRI_vector_t leftResult;
|
||||
TRI_vector_t rightResult;
|
||||
|
@ -811,7 +817,6 @@ static void SkiplistIndex_findHelper(SkiplistIndex* skiplistIndex,
|
|||
case TRI_GT_INDEX_OPERATOR:
|
||||
|
||||
values.fields = relationOperator->_fields;
|
||||
values.numFields = relationOperator->_numFields;
|
||||
|
||||
default: {
|
||||
// must not access relationOperator->xxx if the operator is not a relational one
|
||||
|
@ -953,7 +958,9 @@ static void SkiplistIndex_findHelper(SkiplistIndex* skiplistIndex,
|
|||
} // end of switch statement
|
||||
}
|
||||
|
||||
TRI_skiplist_iterator_t* SkiplistIndex_find(SkiplistIndex* skiplistIndex, TRI_vector_t* shapeList, TRI_index_operator_t* indexOperator) {
|
||||
TRI_skiplist_iterator_t* SkiplistIndex_find (SkiplistIndex* skiplistIndex,
|
||||
TRI_vector_t* shapeList,
|
||||
TRI_index_operator_t* indexOperator) {
|
||||
TRI_skiplist_iterator_t* results;
|
||||
|
||||
results = TRI_Allocate(TRI_UNKNOWN_MEM_ZONE, sizeof(TRI_skiplist_iterator_t), true);
|
||||
|
@ -980,7 +987,8 @@ TRI_skiplist_iterator_t* SkiplistIndex_find(SkiplistIndex* skiplistIndex, TRI_ve
|
|||
/// @brief inserts a data element into a unique skip list
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
int SkiplistIndex_insert (SkiplistIndex* skiplistIndex, TRI_skiplist_index_element_t* element) {
|
||||
int SkiplistIndex_insert (SkiplistIndex* skiplistIndex,
|
||||
TRI_skiplist_index_element_t* element) {
|
||||
TRI_skiplist_index_key_t key;
|
||||
int result;
|
||||
|
||||
|
@ -995,7 +1003,8 @@ int SkiplistIndex_insert (SkiplistIndex* skiplistIndex, TRI_skiplist_index_eleme
|
|||
/// @brief removes an entry from the skip list
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
int SkiplistIndex_remove (SkiplistIndex* skiplistIndex, TRI_skiplist_index_element_t* element) {
|
||||
int SkiplistIndex_remove (SkiplistIndex* skiplistIndex,
|
||||
TRI_skiplist_index_element_t* element) {
|
||||
int result;
|
||||
|
||||
result = TRI_RemoveElementSkipList(skiplistIndex->skiplist.uniqueSkiplist, element, NULL);
|
||||
|
@ -1025,7 +1034,8 @@ int SkiplistIndex_remove (SkiplistIndex* skiplistIndex, TRI_skiplist_index_eleme
|
|||
/// @brief creates a new non-uniqe (allows duplicates) multi skiplist
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
SkiplistIndex* MultiSkiplistIndex_new (TRI_primary_collection_t* primary) {
|
||||
SkiplistIndex* MultiSkiplistIndex_new (TRI_primary_collection_t* primary,
|
||||
size_t numFields) {
|
||||
SkiplistIndex* skiplistIndex;
|
||||
int res;
|
||||
|
||||
|
@ -1045,6 +1055,7 @@ SkiplistIndex* MultiSkiplistIndex_new (TRI_primary_collection_t* primary) {
|
|||
|
||||
res = TRI_InitSkipListMulti(skiplistIndex->skiplist.nonUniqueSkiplist,
|
||||
primary,
|
||||
numFields,
|
||||
TRI_SKIPLIST_PROB_HALF,
|
||||
40);
|
||||
|
||||
|
@ -1226,7 +1237,6 @@ static void MultiSkiplistIndex_findHelper (SkiplistIndex* skiplistIndex,
|
|||
case TRI_GT_INDEX_OPERATOR:
|
||||
|
||||
values.fields = relationOperator->_fields;
|
||||
values.numFields = relationOperator->_numFields;
|
||||
|
||||
default: {
|
||||
// must not access relationOperator->xxx if the operator is not a relational one
|
||||
|
|
|
@ -67,13 +67,11 @@ typedef struct {
|
|||
|
||||
|
||||
typedef struct {
|
||||
size_t numFields; // the number of fields
|
||||
TRI_shaped_json_t* fields; // list of shaped json objects which the collection should know about
|
||||
}
|
||||
TRI_skiplist_index_key_t;
|
||||
|
||||
typedef struct {
|
||||
size_t numFields; // the number of fields
|
||||
TRI_shaped_sub_t* _subObjects; // list of shaped json objects which the collection should know about
|
||||
struct TRI_doc_mptr_s* _document; // master document pointer
|
||||
}
|
||||
|
@ -150,7 +148,8 @@ int SkiplistIndex_assignMethod (void*, TRI_index_method_assignment_type_e);
|
|||
//------------------------------------------------------------------------------
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
SkiplistIndex* SkiplistIndex_new (struct TRI_primary_collection_s*);
|
||||
SkiplistIndex* SkiplistIndex_new (struct TRI_primary_collection_s*,
|
||||
size_t);
|
||||
|
||||
TRI_skiplist_iterator_t* SkiplistIndex_find (SkiplistIndex*, TRI_vector_t*, TRI_index_operator_t*);
|
||||
|
||||
|
@ -168,7 +167,8 @@ bool SkiplistIndex_update (SkiplistIndex*, const TRI_skiplist_index_element_t*,
|
|||
//------------------------------------------------------------------------------
|
||||
|
||||
|
||||
SkiplistIndex* MultiSkiplistIndex_new (struct TRI_primary_collection_s*);
|
||||
SkiplistIndex* MultiSkiplistIndex_new (struct TRI_primary_collection_s*,
|
||||
size_t);
|
||||
|
||||
TRI_skiplist_iterator_t* MultiSkiplistIndex_find (SkiplistIndex*, TRI_vector_t*, TRI_index_operator_t*);
|
||||
|
||||
|
|
|
@ -1708,8 +1708,7 @@ static int InsertSkiplistIndex (TRI_index_t* idx,
|
|||
// These will be used for comparisions
|
||||
// ............................................................................
|
||||
|
||||
skiplistElement.numFields = skiplistIndex->_paths._length;
|
||||
skiplistElement._subObjects = TRI_Allocate(TRI_UNKNOWN_MEM_ZONE, sizeof(TRI_shaped_sub_t) * skiplistElement.numFields, false);
|
||||
skiplistElement._subObjects = TRI_Allocate(TRI_UNKNOWN_MEM_ZONE, sizeof(TRI_shaped_sub_t) * skiplistIndex->_paths._length, false);
|
||||
|
||||
if (skiplistElement._subObjects == NULL) {
|
||||
LOG_WARNING("out-of-memory in InsertSkiplistIndex");
|
||||
|
@ -1860,8 +1859,7 @@ static int RemoveSkiplistIndex (TRI_index_t* idx,
|
|||
// Allocate some memory for the SkiplistIndexElement structure
|
||||
// ............................................................................
|
||||
|
||||
skiplistElement.numFields = skiplistIndex->_paths._length;
|
||||
skiplistElement._subObjects = TRI_Allocate(TRI_UNKNOWN_MEM_ZONE, sizeof(TRI_shaped_json_t) * skiplistElement.numFields, false);
|
||||
skiplistElement._subObjects = TRI_Allocate(TRI_UNKNOWN_MEM_ZONE, sizeof(TRI_shaped_json_t) * skiplistIndex->_paths._length, false);
|
||||
|
||||
if (skiplistElement._subObjects == NULL) {
|
||||
LOG_WARNING("out-of-memory in InsertSkiplistIndex");
|
||||
|
@ -1945,8 +1943,6 @@ TRI_index_t* TRI_CreateSkiplistIndex (TRI_primary_collection_t* primary,
|
|||
return NULL;
|
||||
}
|
||||
|
||||
skiplistIndex->base._collection = primary;
|
||||
|
||||
idx = &skiplistIndex->base;
|
||||
|
||||
idx->typeName = TypeNameSkiplistIndex;
|
||||
|
@ -1977,10 +1973,10 @@ TRI_index_t* TRI_CreateSkiplistIndex (TRI_primary_collection_t* primary,
|
|||
}
|
||||
|
||||
if (unique) {
|
||||
skiplistIndex->_skiplistIndex = SkiplistIndex_new(primary);
|
||||
skiplistIndex->_skiplistIndex = SkiplistIndex_new(primary, paths->_length);
|
||||
}
|
||||
else {
|
||||
skiplistIndex->_skiplistIndex = MultiSkiplistIndex_new(primary);
|
||||
skiplistIndex->_skiplistIndex = MultiSkiplistIndex_new(primary, paths->_length);
|
||||
}
|
||||
|
||||
if (skiplistIndex->_skiplistIndex == NULL) {
|
||||
|
|
Loading…
Reference in New Issue