Hi, I am testing in Windows XP compiling with Visual Studio 2010.
I have a console test application using directly the "shapefil" library.
I will use test_ogrsf utility for a complete benchmark
I this environment and my test application, using OGRFastAtof(), the full read
of a huge shape around 500.000 records (500mb of shp file, 150mb of dbf file)
with eight double fields goes from 5.6sg to 3.06sg. I don't evaluate that the
precision loss, it is a task for check.
In addition, using filemapping with boost library, the full process goes from
3.06sg to 1.45sg.
These values as you see are approximate, but they give an idea of
optimization is possible at least for this OS.
It is why I wanted to check this behavior
thanks!
/////////////////////////////////////////////////////////////////////////////////////////////////////////
// TEST BOOST - MEMORY MAPPING FILE
#include <boost/filesystem.hpp>
#include <boost/iostreams/device/mapped_file.hpp>
#define ROOT_LIB_PATH( __RELATIVE_PATH ) "/TFS_OSGeo/SIT/SIG_SDK/Open
Source/boost-1.54.0"#__RELATIVE_PATH
#if _DEBUG
#pragma comment(lib, ROOT_LIB_PATH(
"/lib32-msvc-10.0/libboost_iostreams-vc100-mt-sgd-1_54.lib" ))
#pragma comment(lib, ROOT_LIB_PATH(
"/lib32-msvc-10.0/libboost_filesystem-vc100-mt-sgd-1_54.lib" ))
#else
#pragma comment(lib, ROOT_LIB_PATH(
"/lib32-msvc-10.0/libboost_iostreams-vc100-mt-s-1_54.lib" ))
#pragma comment(lib, ROOT_LIB_PATH(
"/lib32-msvc-10.0/libboost_filesystem-vc100-mt-s-1_54.lib" ))
#endif
//-------------------------------------------------------------------------------------------------------
// Helper wrapper class for boost::mapped_file.
class mapped_file_manager
{
public:
mapped_file_manager() : file(NULL), length(0), tell(0)
{
}
~mapped_file_manager()
{
close();
}
public:
boost::iostreams::mapped_file* file;
uintmax_t length;
uintmax_t tell;
public:
bool open(const char *pszFilename, bool readOnly)
{
if (boost::filesystem::exists(pszFilename))
{
boost::iostreams::mapped_file* fileP = new
boost::iostreams::mapped_file();
fileP->open(pszFilename, readOnly ?
boost::iostreams::mapped_file_source::readwrite :
boost::iostreams::mapped_file_source::readwrite);
if (fileP->is_open())
{
length =
boost::filesystem::file_size(pszFilename);
file = fileP;
return true;
}
}
return false;
}
bool close()
{
if (file)
{
length = 0;
tell = 0;
file->close();
delete file;
file = NULL;
return true;
}
return false;
}
};
SAFile MMF_SHP_Open( const char *pszFilename, const char *pszAccess )
{
if (boost::filesystem::exists(pszFilename))
{
mapped_file_manager* manager = new mapped_file_manager();
if (manager->open(pszFilename, strstr(pszAccess, "r")!=NULL))
{
#if _DEBUG
size_t size = manager->file->size();
#endif
return (SAFile)manager;
}
delete manager;
}
return NULL;
}
SAOffset MMF_SHP_Read( void *p, SAOffset size, SAOffset nmemb, SAFile file )
{
mapped_file_manager* manager = (mapped_file_manager*)file;
char* data = manager->file->data();
int memoyrSize = size*nmemb;
memcpy(p, data+manager->tell, memoyrSize);
manager->tell += memoyrSize;
return nmemb;
}
SAOffset MMF_SHP_Write( void *p, SAOffset size, SAOffset nmemb, SAFile file )
{
mapped_file_manager* manager = (mapped_file_manager*)file;
char* data = manager->file->data();
int memoyrSize = size*nmemb;
memcpy(data+manager->tell, p, memoyrSize);
manager->tell += memoyrSize;
return nmemb;
}
SAOffset MMF_SHP_Seek( SAFile file, SAOffset offset, int whence )
{
mapped_file_manager* manager = (mapped_file_manager*)file;
if (whence==SEEK_SET)
{
manager->tell = offset;
return 0;
}
else
if (whence==SEEK_END)
{
manager->tell = manager->length+offset;
return offset<0 ? 0 : 1;
}
else
if (whence==SEEK_CUR)
{
manager->tell = manager->tell+offset;
return 0;
}
return 2;
}
SAOffset MMF_SHP_Tell( SAFile file )
{
mapped_file_manager* manager = (mapped_file_manager*)file;
return (SAOffset)manager->tell;
}
int MMF_SHP_Flush( SAFile file )
{
mapped_file_manager* manager = (mapped_file_manager*)file;
// TODO:
return 0;
}
int MMF_SHP_Close( SAFile file )
{
if (file)
{
mapped_file_manager* manager = (mapped_file_manager*)file;
manager->close();
delete manager;
return 1;
}
return 0;
}
void MMF_SHP_Error( const char *message )
{
CPLError( CE_Failure, CPLE_AppDefined, "%s", message );
}
int MMF_SHP_Remove( const char *pszFilename )
{
return VSIUnlink( pszFilename );
}
//-------------------------------------------------------------------------------------------------------
void SASetupBoostlibHooks( SAHooks *psHooks )
{
psHooks->FOpen = MMF_SHP_Open;
psHooks->FRead = MMF_SHP_Read;
psHooks->FWrite = MMF_SHP_Write;
psHooks->FSeek = MMF_SHP_Seek;
psHooks->FTell = MMF_SHP_Tell;
psHooks->FFlush = MMF_SHP_Flush;
psHooks->FClose = MMF_SHP_Close;
psHooks->Remove = MMF_SHP_Remove;
psHooks->Atof = DBFFastAtof;
psHooks->Error = MMF_SHP_Error;
}
//-------------------------------------------------------------------------------------------------------
_______________________________________________
gdal-dev mailing list
gdal-dev@lists.osgeo.org
http://lists.osgeo.org/mailman/listinfo/gdal-dev