#include "StdAfx.h" #include "mapmatrix.h" #include "_log.h" #include //************************************************************************************* BOOL CmapMatFloat::lee( char *path, char *ext, BOOL mismosvect/*=TRUE*/) { BOOL mal=FALSE; for(int ic=0; ic<(int)dat.size() && !mal; ic++) { if(!dat[ic].lee(ic,path,ext,(int)dat.size(),mismosvect)) mal=TRUE; } return !mal; } //************************************************************************************* BOOL CmapRowFloat::guarda(HeadCostConj hd, int ic, char *path , char *ext, Cgarray *bufer) { HANDLE hfile = INVALID_HANDLE_VALUE; int nb, i; char file[MAX_PATH]; sprintf_s(file,MAX_PATH,"%s%06d.%s",path,ic,ext); //crea archivo----------------------------------- hfile = CreateFile(file, GENERIC_WRITE | GENERIC_READ, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0); if (hfile == INVALID_HANDLE_VALUE) { i=GetLastError(); return FALSE; } //graba cabecera------------ hd.isVect=isVect; if(isVect) { hd.n=(int)datv.size(); } else { hd.n=(int)dat.size(); } nb = sizeof(hd); if (nb != _lwrite((int)hfile, (LPCCH)&hd, nb)) { goto va_mal; } if(isVect) { //guarda las componentes del vector nb=sizeof(float); for(i=0;i auxbuf; Cgarray *buff; if(bufer) buff = bufer; else buff = &auxbuf; int nbufer= min(hd.n,1000); if(!((*buff)+=nbufer)) { goto va_mal; } buff->n = nbufer; //guarda componente a componente del map int ii = 0; for (std::map::iterator it=dat.begin(); it!=dat.end(); ++it) { //int aux = it->first; (*buff)[ii].k =it->first; (*buff)[ii].v =it->second; ii++; if(ii>=buff->n) { nb = buff->n*sizeof(MapDataFloat); if (nb != _lwrite((int)hfile, (LPCCH) buff->ptr, nb)) { goto va_mal; } ii =0; } } if(ii>0) { nb = ii*sizeof(MapDataFloat); if (nb != _lwrite((int)hfile, (LPCCH) buff->ptr, nb)) { goto va_mal; } } } CloseHandle(hfile); return TRUE; va_mal: CloseHandle(hfile); return FALSE; } //************************************************************************************* //ntot solo se usa cuando es map y pasa a vector, porque se necesita cuántos elementos en total tiene que haber BOOL CmapRowFloat::lee(int ic, char *path , char *ext, int ntot, BOOL mismosvect/*=TRUE*/, Cgarray *bufer/* = NULL*/) { HANDLE hfile = INVALID_HANDLE_VALUE; int nb, i; char file[MAX_PATH]; HeadCostConj hd; Cgarray buffaux; sprintf_s(file,MAX_PATH,"%s%06d.%s",path,ic,ext); //crea archivo----------------------------------- hfile = CreateFile(file, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); if (hfile == INVALID_HANDLE_VALUE) { i=GetLastError(); return FALSE; } //lee cabecera------------ memset(&hd,0,sizeof(HeadCostConj)); nb = sizeof(hd); if (nb != _lread((int)hfile,&hd, nb)) { goto va_mal; } if(mismosvect) isVect=hd.isVect; int j=0; float d=0; nb=sizeof(float); dat.clear(); datv.clear(); Cgarray *buff; if(bufer) { bufer->n=0; buff = bufer; } else buff =&buffaux; int nbufer= min(hd.n,1000); if(hd.isVect) { if(isVect) { //vector a vector datv.reserve(hd.n); /*for (int i = 0; iptr, nb)) break; for(int ii =0; iiptr)[ii]); nl+=nn; } } } else { if(!((*buff)+=nbufer)) { goto va_mal; } buff->n=0; //lee componente a componente del map int nl =0; int nn = 0; if(isVect) datv.insert(datv.begin(),ntot,VALNOEXIST_FLOAT); for(int i=0;iptr, nb)) break; for(int ii =0; ii buff; int nbufer= min(hd.n,1000); if(!(buff+=nbufer)) { goto va_mal; } buff.n = nbufer; //guarda componente a componente del map int ii = 0; for (std::map::iterator it=dat.begin(); it!=dat.end(); ++it) { //int aux = it->first; buff[ii].k=it->first; buff[ii].v =it->second; ii++; if(ii>=buff.n) { nb = buff.n*sizeof(MapDataInt); if (nb != _lwrite((int)hfile, (LPCCH) buff.ptr, nb)) { goto va_mal; } ii =0; } } if(ii>0) { nb = ii*sizeof(MapDataInt); if (nb != _lwrite((int)hfile, (LPCCH) buff.ptr, nb)) { goto va_mal; } } } CloseHandle(hfile); return TRUE; va_mal: CloseHandle(hfile); return FALSE; } //************************************************************************************* //falta optimizar al estilo CmapRowFloat BOOL CmapRowInt::lee(int ic, char *path , char *ext, BOOL mismosvect/*=TRUE*/) { HANDLE hfile = INVALID_HANDLE_VALUE; int nb, i; char file[MAX_PATH]; HeadCostConj hd; sprintf_s(file,MAX_PATH,"%s%06d.%s",path,ic,ext); //crea archivo----------------------------------- hfile = CreateFile(file, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); if (hfile == INVALID_HANDLE_VALUE) { i=GetLastError(); return FALSE; } //lee cabecera------------ memset(&hd,0,sizeof(HeadCostConj)); nb = sizeof(hd); if (nb != _lread((int)hfile,&hd, nb)) { goto va_mal; } if(mismosvect) isVect=hd.isVect;//fuerza a que donde lee sea vect o no igual que lo que lee, o no int j=0; int d=0; nb=sizeof(int); if(hd.isVect) { //lee los componentes del vector for(i=0;i buff; for(int ic=ini; icdat.size(),&buff)) mal=TRUE; } } //************************************************************************************* BOOL CmapMatFloat::leeThread( char *path, char *ext, int nthread, BOOL mismosvect/*=TRUE*/) { ThMapMatFloatLee th[MAX_THREAD_LEE]; int nth = min(nthread,MAX_THREAD_LEE); int n = (int)ceil(dat.size()*1./nth); int asig = 0; int i=0; //C_log::log("leeThread","tot %ld n %ld", dat.size(),n); for(i=0; i