1
0
Fork 0

less memory usage

This commit is contained in:
Jan Steemann 2013-09-19 12:29:29 +02:00
parent f2810fe9fc
commit fe667646c0
6 changed files with 45 additions and 50 deletions

View File

@ -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;

View File

@ -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

View File

@ -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);

View File

@ -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

View File

@ -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*);

View File

@ -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) {