25 #ifndef __TERRALIB_RP_INTERNAL_MATRIX_H
26 #define __TERRALIB_RP_INTERNAL_MATRIX_H
30 #include "../common/PlatformUtils.h"
39 #include <boost/scoped_array.hpp>
40 #include <boost/filesystem.hpp>
50 template<
typename TemplateElementType >
111 bool reset(
unsigned int lines,
unsigned int columns );
123 bool reset(
unsigned int lines,
unsigned int columns,
138 bool reset(
unsigned int lines,
unsigned int columns,
139 MemoryPolicy memoryPolicy,
unsigned char maxMemPercentUsage );
154 bool reset(
unsigned int lines,
unsigned int columns,
155 MemoryPolicy memoryPolicy,
unsigned long int maxTmpFileSize,
156 unsigned char maxMemPercentUsage );
204 const unsigned int& line,
205 const unsigned int& column )
221 const unsigned int& line,
222 const unsigned int& column )
const
242 const unsigned int& line )
259 const unsigned int& line )
const
405 const unsigned int& line )
const;
415 std::string& fullFileName )
const;
418 template<
typename TemplateElementType >
425 template<
typename TemplateElementType >
430 template<
typename TemplateElementType >
436 template<
typename TemplateElementType >
441 remove( m_fullFileName.c_str() );
446 template<
typename TemplateElementType >
458 template<
typename TemplateElementType >
464 template<
typename TemplateElementType >
473 template<
typename TemplateElementType >
479 template<
typename TemplateElementType >
485 template<
typename TemplateElementType >
491 template<
typename TemplateElementType >
493 unsigned int columns )
499 template<
typename TemplateElementType >
507 template<
typename TemplateElementType >
510 unsigned char maxMemPercentUsage )
513 maxMemPercentUsage );
516 template<
typename TemplateElementType >
519 unsigned long int maxTmpFileSize,
520 unsigned char maxMemPercentUsage )
532 if( ( lines > 0 ) && ( columns > 0 ) )
541 const unsigned int lineSizeBytes = (
unsigned int)(
553 TemplateElementType* newLinePtr = 0;
555 for(
unsigned int allLinesPtrsVecIdx = 0 ; allLinesPtrsVecIdx <
577 unsigned int maxRAMLines = 1;
589 const double freeVMem =
MIN( totalPhysMem,
590 ( totalVMem - usedVMem ) );
595 maxRAMLines = (
unsigned int)
MAX( 1.0, linesMem /
596 ((
double)lineSizeBytes) );
601 const unsigned int ramLinesIndexesVecSize =
MIN( maxRAMLines,
607 TemplateElementType* newLinePtr = 0;
609 for(
unsigned int allLinesPtrsVecIdx = 0 ; allLinesPtrsVecIdx <
610 ramLinesIndexesVecSize ; ++allLinesPtrsVecIdx )
641 template<
typename TemplateElementType >
644 TemplateElementType* linePtr = 0;
645 for(
unsigned int memoryblocksHandlerIdx = 0 ; memoryblocksHandlerIdx <
652 delete[] ( linePtr );
670 template<
typename TemplateElementType >
677 template<
typename TemplateElementType >
684 template<
typename TemplateElementType >
690 template<
typename TemplateElementType >
697 "Unable to initiate the matrix object" );
699 unsigned int column = 0;;
700 TemplateElementType
const* inLinePtr = 0;
701 TemplateElementType* outLinePtr = 0;
703 for(
unsigned int line = 0 ; line <
m_totalLines ; ++line )
709 outLinePtr[ column ] = inLinePtr[ column ];
716 template<
typename TemplateElementType >
722 template<
typename TemplateElementType >
728 template<
typename TemplateElementType >
734 template<
typename TemplateElementType >
737 const unsigned long int diskLinesNmb =
m_totalLines - startingLineIdx;
741 const unsigned long int lineSizeBytes = (
unsigned long int)(
744 const unsigned long int maxLinesPerFile = (
unsigned long int )
747 const unsigned long int maxFileSize = (
unsigned long int)
748 ( maxLinesPerFile * lineSizeBytes );
750 const unsigned int openDiskFilesNumber = (
unsigned int)ceil( ((
double)diskLinesNmb)
751 / ((
double)maxLinesPerFile) );
757 unsigned int remainingLinesNmb = diskLinesNmb;
758 unsigned int fileSize = 0;
759 unsigned int fileLinesNumber = 0;
760 unsigned int diskLinesVecIdx = startingLineIdx;
762 for(
unsigned int fileIdx = 0 ; fileIdx < openDiskFilesNumber ;
767 fileSize = maxFileSize;
768 fileLinesNumber = maxLinesPerFile;
770 if( remainingLinesNmb < maxLinesPerFile )
772 fileSize = (
unsigned long int)( lineSizeBytes * remainingLinesNmb );
773 fileLinesNumber = remainingLinesNmb;
776 remainingLinesNmb -= fileLinesNumber;
780 FILE* newFilePtr = 0;
781 std::string newFullFileName;
785 TERP_LOGERR(
"Unable to create temporary disk file" );
794 for(
unsigned int lineIdx = 0; lineIdx < fileLinesNumber ; ++lineIdx )
809 template<
typename TemplateElementType >
840 (
long)( inLineData.m_fileOff ), SEEK_SET ),
845 (
size_t)(
sizeof( TemplateElementType ) *
m_totalColumns ), 1, inLineData.m_filePtr ),
851 (
long)( inLineData.m_fileOff ), SEEK_SET ),
858 (
size_t)(
sizeof( TemplateElementType ) * m_totalColumns ), 1,
859 inLineData.m_filePtr ),
"File write error" )
873 outLineData.m_filePtr = inLineData.m_filePtr;
874 outLineData.m_fileOff = inLineData.m_fileOff;
876 inLineData.m_filePtr = 0;
877 inLineData.m_fileOff = 0;
890 template<
typename TemplateElementType >
892 FILE** fileptr, std::string& fullFileName )
const
894 fullFileName = boost::filesystem::unique_path(
895 boost::filesystem::temp_directory_path() /=
896 boost::filesystem::path(
"TerralibRPMatrix_%%%%-%%%%-%%%%-%%%%" ) ).string();
897 if( fullFileName.empty() )
902 (*fileptr) = fopen( fullFileName.c_str(),
"wb+" );
905 long seekoff = (long)( size - 1 );
907 if( 0 != fseek( (*fileptr), seekoff, SEEK_SET ) )
909 fclose( (*fileptr) );
910 remove( fullFileName.c_str() );
915 unsigned char c =
'\0';
916 if( 1 != fwrite( &c, 1, 1, (*fileptr) ) )
918 fclose( (*fileptr) );
919 remove( fullFileName.c_str() );
928 #endif //__TERRALIB_RP_INTERNAL_MATRIX_H
void clear()
Clear all allocated resources and go back to the initial default parameters.
unsigned int m_fileOff
The offset within the file.
TECOMMONEXPORT unsigned long int GetTotalPhysicalMemory()
Returns the amount of total physical memory (bytes).
FILE * m_filePtr
The file pointer.
unsigned char m_maxMemPercentUsage
the max amount of free memory to use when necessary.
TECOMMONEXPORT unsigned long int GetUsedVirtualMemory()
Returns the amount of used virtual memory (bytes) for the current process (physical + swapped)...
unsigned char getMaxMemPercentUsage() const
Returns the max amount of free memory to use when necessary.
std::vector< DiskLineInfo > m_diskLinesInfoVec
Info of all lines, used when a line is on disk.
#define MIN(a, b)
Macro that returns min between two values.
#define TERP_LOGERR(message)
Logs an error message.
const TemplateElementType & operator()(const unsigned int &line, const unsigned int &column) const
Operator () overload.
TemplateElementType & operator()(const unsigned int &line, const unsigned int &column)
Operator () overload.
bool allocateDiskLines(unsigned int startingLineIdx)
Allocate disk lines.
#define MAX(a, b)
Macro that returns max between two values.
void init()
Reset the internal variables to the initial state.
MemoryPolicy m_memoryPolicy
The used memory policy (default:RAMMemPol).
MemoryPolicy getMemPolicy() const
Returns the current memory policy.
#define TERP_TRUE_OR_RETURN_FALSE(value, message)
Checks if value is true. For false values a warning message will be logged and a return of context wi...
unsigned long int m_maxTmpFileSize
Max bytes per temp file (for swapped tiles only, default: 2GB).
std::vector< unsigned int > m_ramLinesIndexesVec
The indexes of all lines loaded into RAM.
MemoryPolicy
Memory polycy.
std::vector< TemplateElementType * > m_allLinesPtrsVec
A vector with pointers to all lines.
unsigned int getColumnsNumber() const
The number of current matrix columns.
Openend disk files info node.
unsigned int m_totalColumns
The total columns number (default:0).
const Matrix< TemplateElementType > & operator=(const Matrix< TemplateElementType > &external)
Operator = overload.
unsigned long int getMaxTmpFileSize() const
Returns the current maximum temporary disk file size.
std::vector< OpenDiskFileHandler > m_openDiskFilesHandler
A vector with open disk files handler.
void reset()
Reset (clear) the active instance data.
TECOMMONEXPORT unsigned long int GetTotalVirtualMemory()
Returns the amount of total virtual memory (bytes) that can be claimed by the current process (physic...
TemplateElementType * getScanLine(const unsigned int &line) const
Returns a pointer to the required line.
#define TERP_LOG_AND_RETURN_FALSE(message)
Logs a warning message will and return false.
TemplateElementType const * operator[](const unsigned int &line) const
Operator [] overload.
std::vector< TemplateElementType * > m_memoryblocksHandler
A generic template matrix.
TemplateElementType ElementTypeT
Public matrix element type definition.
FILE * m_filePtr
The file pointer.
TemplateElementType * m_currentSwapTilePtr
A pointer to the current swap tile.
unsigned int m_nextSwapLineRamLinesIndexesVecIdx
The index inside ramLinesIndexesVec_ of the next RAM line index that will be swapped to disk when a d...
bool createNewDiskFile(unsigned long int size, FILE **fileptr, std::string &fullFileName) const
Create a new disk file.
#define TERP_DEBUG_TRUE_OR_THROW(value, message)
Checks if value is true and throws an exception if not.
std::string m_fullFileName
The full created file name.
bool isEmpty() const
Empty Matrix verification.
unsigned int m_totalLines
The total lines number (default:0).
unsigned int getLinesNumber() const
The number of current matrix lines.
TemplateElementType * operator[](const unsigned int &line)
Operator [] overload.
#define TERP_TRUE_OR_THROW(value, message)
Checks if value is true and throws an exception if not.
boost::scoped_array< TemplateElementType > m_swapMemoryBlockHandler
An auxiliar line used when swapping data to/from disk.