How can that be a valid test if you don't know the size of the strings that
AliR.
"jjoohhnn" <jjoohhnn@microsoft.discussions.com> ha scritto nel messaggio
news:urLelxUoJHA.6060@TK2MSFTNGP05.phx.gbl...
I have CPtrArray and CMapStringToString objects in my application.
I am creating strings on heap and storing address in CPtrArray object.
After that, reading strings from CPtrArray and process on this string
then store output string as a key/value in CMapStringToString object.
It is giving positive results in case of CPtrArray has 1,000,000 entries.
if CPtrArray has 4,000,000 entries, then after 1,000,000 + entry it is
giving null pointer. I could not read the strings from CPtrArray.
How to resolve this issue?
Hi,
I tried a simple simulation of what I thought might be your scenario, but
using STL containers (which in some past experience I found better than
MFC containers to store big stuff, IMHO).
I tried with an STL std::vector of strings, and a std::map of strings to
strings, and the simple test seems OK to me on my machine with 3 GB of RAM
and 4,000,000 items in the array.
Here it is a sample MFC application (VS2008 project) with source code:
http://www.geocities.com/giovanni.dicanio/vc/TestBigArray.zip
Note that I used std::wstring to store the (Unicode) strings in the STL
containers, but you can use CString as well.
A sample portion of code follows:
<code>
//////////////////////////////////////////////////////////////////////////
// *** TEST ***
//////////////////////////////////////////////////////////////////////////
std::wstring BuildTestString(size_t i)
{
std::wostringstream os;
os << L"This is string #" << i;
return os.str();
}
std::wstring BuildTestStringInMap(size_t i)
{
std::wostringstream os;
os << L"String in map #" << i;
return os.str();
}
void CTestBigArrayDlg::OnBnClickedButtonTest1()
{
typedef std::vector< std::wstring > StringArray;
typedef std::map< std::wstring, std::wstring > MapStringToString;
StringArray array;
MapStringToString map;
// Number of items
// size_t count = 10; // <<-- fast test
size_t count = 4000000;
// Fill the array
array.reserve(count);
for (size_t i = 0; i < count; i++)
{
array.push_back( BuildTestString(i) );
}
// Fill the map
for (size_t i = 0; i < array.size(); i++ )
{
std::wstring key = array[i];
std::wstring value = BuildTestStringInMap(i);
// Build association between strings, and store it in map
map[ key ] = value;
}
ASSERT( map.size() == array.size() );
// Verification loop
for (size_t i = 0; i < array.size(); i++ )
{
std::wstring value = BuildTestStringInMap(i);
std::wstring key = array[i];
if ( map[ key ] != value )
{
ASSERT(FALSE);
std::wostringstream os;
os << L"Failed check at position " << i;
AfxMessageBox( os.str().c_str(), MB_OK|MB_ICONERROR);
return;
}
}
AfxMessageBox( L"All right.", MB_OK );
}
</code>
If you may want to post a compilable sample code of yours, we could try to
give you better help.
HTH,
Giovanni