repaired memory leak
This commit is contained in:
parent
7f2a212c6a
commit
ce400eb185
@ -161,7 +161,7 @@ void Concordia::loadRAMIndexFromDisk() {
|
|||||||
throw ConcordiaException("Index corrupt: empty markers file");
|
throw ConcordiaException("Index corrupt: empty markers file");
|
||||||
}
|
}
|
||||||
// generating suffix array
|
// generating suffix array
|
||||||
_SA = _index->generateSuffixArray(_T);
|
_index->generateSuffixArray(_T,_SA);
|
||||||
} catch (const std::bad_alloc&) {
|
} catch (const std::bad_alloc&) {
|
||||||
throw ConcordiaException("Error allocating memory, probably out of memory.");
|
throw ConcordiaException("Error allocating memory, probably out of memory.");
|
||||||
}
|
}
|
||||||
@ -171,7 +171,7 @@ void Concordia::loadRAMIndexFromDisk() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Concordia::refreshSAfromRAM() {
|
void Concordia::refreshSAfromRAM() {
|
||||||
_SA = _index->generateSuffixArray(_T);
|
_index->generateSuffixArray(_T,_SA);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -179,20 +179,14 @@ void Concordia::_initializeIndex() {
|
|||||||
_hashGenerator = boost::shared_ptr<HashGenerator>(
|
_hashGenerator = boost::shared_ptr<HashGenerator>(
|
||||||
new HashGenerator(_indexPath,
|
new HashGenerator(_indexPath,
|
||||||
_config));
|
_config));
|
||||||
_T = boost::shared_ptr<std::vector<sauchar_t> >(
|
_T = boost::shared_ptr<std::vector<sauchar_t> >(new std::vector<sauchar_t>);
|
||||||
new std::vector<sauchar_t>);
|
_SA = boost::shared_ptr<std::vector<saidx_t> >(new std::vector<saidx_t>);
|
||||||
_markers = boost::shared_ptr<std::vector<SUFFIX_MARKER_TYPE> >(
|
_markers = boost::shared_ptr<std::vector<SUFFIX_MARKER_TYPE> >(
|
||||||
new std::vector<SUFFIX_MARKER_TYPE>);
|
new std::vector<SUFFIX_MARKER_TYPE>);
|
||||||
if (boost::filesystem::exists(_getWordMapFilePath())
|
if ( boost::filesystem::exists(_getWordMapFilePath())
|
||||||
&& boost::filesystem::exists(_getHashedIndexFilePath())) {
|
&& boost::filesystem::exists(_getHashedIndexFilePath())
|
||||||
|
&& boost::filesystem::exists(_getMarkersFilePath())) {
|
||||||
loadRAMIndexFromDisk();
|
loadRAMIndexFromDisk();
|
||||||
} else if (!boost::filesystem::exists(_getWordMapFilePath())
|
|
||||||
&& !boost::filesystem::exists(_getHashedIndexFilePath())) {
|
|
||||||
// empty index
|
|
||||||
_SA = boost::shared_ptr<std::vector<saidx_t> >(
|
|
||||||
new std::vector<saidx_t>);
|
|
||||||
} else {
|
|
||||||
throw ConcordiaException("Index corrupt: missing files");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -18,21 +18,16 @@ ConcordiaIndex::ConcordiaIndex(const std::string & hashedIndexFilePath,
|
|||||||
ConcordiaIndex::~ConcordiaIndex() {
|
ConcordiaIndex::~ConcordiaIndex() {
|
||||||
}
|
}
|
||||||
|
|
||||||
boost::shared_ptr<std::vector<saidx_t> > ConcordiaIndex::generateSuffixArray(
|
void ConcordiaIndex::generateSuffixArray(
|
||||||
boost::shared_ptr<std::vector<sauchar_t> > T) {
|
boost::shared_ptr<std::vector<sauchar_t> > T,
|
||||||
saidx_t * SA_array = new saidx_t[T->size()];
|
boost::shared_ptr<std::vector<saidx_t> > SA) {
|
||||||
if (divsufsort(T->data(), SA_array, (saidx_t) T->size()) != 0) {
|
SA->clear();
|
||||||
|
for(int i=0;i<T->size();i++) {
|
||||||
|
SA->push_back(0);
|
||||||
|
}
|
||||||
|
if (divsufsort(T->data(), SA->data(), (saidx_t) T->size()) != 0) {
|
||||||
throw ConcordiaException("Error creating suffix array.");
|
throw ConcordiaException("Error creating suffix array.");
|
||||||
}
|
}
|
||||||
|
|
||||||
boost::shared_ptr<std::vector<saidx_t> > result =
|
|
||||||
boost::shared_ptr<std::vector<saidx_t> >(new std::vector<saidx_t>);
|
|
||||||
for (int i = 0; i < T->size(); i++) {
|
|
||||||
result->push_back(SA_array[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
delete[] SA_array;
|
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<TokenizedSentence> ConcordiaIndex::addAllExamples(
|
std::vector<TokenizedSentence> ConcordiaIndex::addAllExamples(
|
||||||
|
@ -116,8 +116,9 @@ public:
|
|||||||
/*! Generates suffix array based on the passed hashed index.
|
/*! Generates suffix array based on the passed hashed index.
|
||||||
\returns the generated suffix array
|
\returns the generated suffix array
|
||||||
*/
|
*/
|
||||||
boost::shared_ptr<std::vector<saidx_t> > generateSuffixArray(
|
void generateSuffixArray(
|
||||||
boost::shared_ptr<std::vector<sauchar_t> > T);
|
boost::shared_ptr<std::vector<sauchar_t> > T,
|
||||||
|
boost::shared_ptr<std::vector<saidx_t> > SA);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void _addSingleTokenizedExample(
|
void _addSingleTokenizedExample(
|
||||||
|
@ -32,7 +32,8 @@ BOOST_AUTO_TEST_CASE( SuffixArrayGenerationTest )
|
|||||||
// n: 0 1 2 3 4 5 6 7 8
|
// n: 0 1 2 3 4 5 6 7 8
|
||||||
//SA[n]: 0 3 1 7 4 2 8 5 6
|
//SA[n]: 0 3 1 7 4 2 8 5 6
|
||||||
|
|
||||||
boost::shared_ptr<std::vector<saidx_t> > SA = index.generateSuffixArray(T);
|
boost::shared_ptr<std::vector<saidx_t> > SA(new std::vector<saidx_t>());
|
||||||
|
index.generateSuffixArray(T,SA);
|
||||||
|
|
||||||
boost::shared_ptr<std::vector<saidx_t> > expectedSA = boost::shared_ptr<std::vector<saidx_t> >(new std::vector<saidx_t>());
|
boost::shared_ptr<std::vector<saidx_t> > expectedSA = boost::shared_ptr<std::vector<saidx_t> >(new std::vector<saidx_t>());
|
||||||
expectedSA->push_back(0);
|
expectedSA->push_back(0);
|
||||||
@ -73,7 +74,8 @@ BOOST_AUTO_TEST_CASE( SuffixArrayGenerationTest2 )
|
|||||||
// n: 0 1 2 3 4 5 6 7 8 9 10 11
|
// n: 0 1 2 3 4 5 6 7 8 9 10 11
|
||||||
//SA[n]: 0 4 1 9 5 2 10 6 8 11 3 7
|
//SA[n]: 0 4 1 9 5 2 10 6 8 11 3 7
|
||||||
|
|
||||||
boost::shared_ptr<std::vector<saidx_t> > SA = index.generateSuffixArray(T);
|
boost::shared_ptr<std::vector<saidx_t> > SA(new std::vector<saidx_t>());
|
||||||
|
index.generateSuffixArray(T,SA);
|
||||||
|
|
||||||
boost::shared_ptr<std::vector<saidx_t> > expectedSA = boost::shared_ptr<std::vector<saidx_t> >(new std::vector<saidx_t>());
|
boost::shared_ptr<std::vector<saidx_t> > expectedSA = boost::shared_ptr<std::vector<saidx_t> >(new std::vector<saidx_t>());
|
||||||
expectedSA->push_back(0);
|
expectedSA->push_back(0);
|
||||||
@ -111,7 +113,8 @@ BOOST_AUTO_TEST_CASE( SuffixArrayGenerationTest3 )
|
|||||||
// n: 0 1 2 3 4 5
|
// n: 0 1 2 3 4 5
|
||||||
//SA[n]: 5 3 1 0 4 2
|
//SA[n]: 5 3 1 0 4 2
|
||||||
|
|
||||||
boost::shared_ptr<std::vector<saidx_t> > SA = index.generateSuffixArray(T);
|
boost::shared_ptr<std::vector<saidx_t> > SA(new std::vector<saidx_t>());
|
||||||
|
index.generateSuffixArray(T,SA);
|
||||||
|
|
||||||
boost::shared_ptr<std::vector<saidx_t> > expectedSA = boost::shared_ptr<std::vector<saidx_t> >(new std::vector<saidx_t>());
|
boost::shared_ptr<std::vector<saidx_t> > expectedSA = boost::shared_ptr<std::vector<saidx_t> >(new std::vector<saidx_t>());
|
||||||
expectedSA->push_back(0);
|
expectedSA->push_back(0);
|
||||||
|
@ -331,6 +331,7 @@ BOOST_AUTO_TEST_CASE( LcpSearch1 )
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
BOOST_AUTO_TEST_CASE( TmMatchesTest )
|
BOOST_AUTO_TEST_CASE( TmMatchesTest )
|
||||||
{
|
{
|
||||||
ConcordiaSearcher searcher;
|
ConcordiaSearcher searcher;
|
||||||
@ -369,7 +370,8 @@ BOOST_AUTO_TEST_CASE( TmMatchesTest )
|
|||||||
index.addExample(hashGenerator, T, markers, Example("Ala posiada rysia",51));
|
index.addExample(hashGenerator, T, markers, Example("Ala posiada rysia",51));
|
||||||
index.addExample(hashGenerator, T, markers, Example("Marysia posiada rysia",123));
|
index.addExample(hashGenerator, T, markers, Example("Marysia posiada rysia",123));
|
||||||
|
|
||||||
boost::shared_ptr<std::vector<saidx_t> > SA = index.generateSuffixArray(T);
|
boost::shared_ptr<std::vector<saidx_t> > SA(new std::vector<saidx_t>());
|
||||||
|
index.generateSuffixArray(T,SA);
|
||||||
|
|
||||||
// searching for pattern "Ola posiada rysia Marysia" (5 1 3 4)
|
// searching for pattern "Ola posiada rysia Marysia" (5 1 3 4)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user