| |
| |
| |
| |
| |
| |
| |
| |
| #ifdef WIN32 |
| # include <windows.h> |
| # include "gdal_priv.h" |
| # include <io.h> |
| #else |
| # include <sys/time.h> |
| # include <unistd.h> |
| # include "./include/gdal_priv.h" |
| # include <stdio.h> |
| # include <string.h> |
| # include <stdlib.h> |
| # include <dirent.h> |
| # include <sys/stat.h> |
| # include <unistd.h> |
| # include <sys/types.h> |
| # include <iostream> |
| #endif |
| |
| #include "getopt.h" |
| #include <iostream> |
| #include <mutex> |
| #include <string> |
| #include <vector> |
| #include <iomanip> |
| #include <string> |
| #include <fstream> |
| |
| using std::string; |
| using std::cout; |
| using std::endl; |
| using std::ifstream; |
| using std::vector; |
| using std::string; |
| using std::cout; |
| using std::hex; |
| using std::endl; |
| using std::setw; |
| using std::streambuf; |
| using std::ofstream; |
| using std::setiosflags; |
| using std::setprecision; |
| using std::ios; |
| using std::mutex; |
| |
| #ifndef no_argument |
| # define no_argument 0 |
| #endif |
| #ifndef required_argument |
| # define required_argument 1 |
| #endif |
| #ifndef opt_argument |
| # define opt_argument 2 |
| #endif |
| |
| const struct option longOpts[] = { |
| { "help", no_argument, NULL, 'h' }, |
| { "recursive", no_argument, NULL, 'r' }, |
| { "nodetail", no_argument, NULL, 'n' }, |
| { "verbose", no_argument, NULL, 'v' }, |
| { "path", required_argument, NULL, 'p' }, |
| { "mode", required_argument, NULL, 'm' }, |
| { "deap", required_argument, NULL, 'd' }, |
| { "layer", required_argument, NULL, 'l' }, |
| { "out", required_argument, NULL, 'o' }, |
| { "ext", required_argument, NULL, 'e' }, |
| { "thread", required_argument, NULL, 't' }, |
| { "random", no_argument, NULL, 1 }, |
| { NULL, 0, NULL, 0 }, |
| }; |
| static const char *optString = "hrnvp:m:d:o:l:e:t:"; |
| |
| string oPath; |
| string oMode; |
| string oOutFile; |
| string oFileExt; |
| int mode; |
| char timE[80]; |
| #define SPLITLINE " --------------------------------------------------------------------------------------------------------------------------------------------" |
| #define MAXBUFSIZE (1024 * 1024 * 500) |
| |
| GUIntBig TotalFilesSize; |
| int threads; |
| int deapth; |
| bool recursive; |
| bool nodetail; |
| bool verbose; |
| bool bContinue; |
| bool bRandom; |
| int bound_map[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; |
| int setedlayer; |
| int curlayer = 1; |
| #define MAXTHREADNUM 300 |
| int ThreadRetFlag[MAXTHREADNUM]; |
| int ThreadRetFlagPos; |
| ofstream of; |
| streambuf* coutBuf; |
| streambuf* fileBuf; |
| |
| #define MAXBANDNUM 10 |
| #define MAXBANDDEAP 3 |
| #define MALLOC521BLOCKSIZE (512*512*MAXBANDNUM*MAXBANDDEAP) |
| GByte * pblock512buff[MAXTHREADNUM]; |
| |
| vector<string> files; |
| int file_num; |
| const char* pszLocalPath; |
| |
| typedef struct{ |
| const char* filepath; |
| int START_X; |
| int START_Y; |
| int SIZE_X; |
| int SIZE_Y; |
| int SIZE_OUT_X; |
| int SIZE_OUT_Y; |
| int bands; |
| int deap; |
| int rand; |
| int f_sizex; |
| int f_sizey; |
| }TASK; |
| |
| typedef vector<TASK> TASKGROUP; |
| typedef vector<TASKGROUP> ALLTASK; |
| ALLTASK AllTask; |
| int taskg_num = 0; |
| |
| typedef struct{ |
| const char* filepath; |
| GUIntBig SIZE; |
| int SIZE_X; |
| int SIZE_Y; |
| int bands; |
| int deap; |
| }info; |
| typedef vector<info> FILESINFO; |
| FILESINFO FilesInfo; |
| |
| CPLString str_print; |
| int str_print_pos; |
| |
| |
| int GDALReadFile(const char* pszLocalFilePath, int extend); |
| void FormatPrint(const char* pszLocalFile, GIntBig nFileSize, int nSizeX, int nSizeY, int Bands, int deap, long timeuse_ms); |
| void f_ExitIfTure(int val, const char* pstr); |
| void getFiles(string path, vector<string>& files); |
| void helpinfo(void); |
| char* DateTimeStr(void); |
| void GatherFilesInfo(void); |
| void AssignTask_mode1(void); |
| void AssignTask_mode2(void); |
| int AssignTask_mode3(int count); |
| void StartThread(void); |
| void WaitUntilFinished(void); |
| void PerformThread(void* parg); |
| void TaskOutput(TASK* task, float timeuse_ms, CPLString & osOut, GIntBig PID); |
| void TaskGroupOutput(TASKGROUP* taskg, float timeuse_ms, CPLString & osOut, GIntBig PID); |
| |
| |
| |
| |
| void helpinfo(void) |
| { |
| #ifdef WIN32 |
| cout << "说明:\n" |
| << " -p or --path 指定文件夹。\n" |
| << " -r or recursive [opt] 指定是否递归搜索子文件夹内的文件,不指定,则不递归搜索。\n" |
| << " -m or --mode 指定读取模式,现有三种模式:1 2 3。\n" |
| << " -t or --thread [opt] 指定并发线程数量,不指定,则为单线程。\n" |
| << " -d or --deap [opt] 指定读取层级深度。不指定,则读取所有有效层级深度,直到放大一次。\n" |
| << " -l or --layer [opt] 指定读取层级。\n" |
| << " -v or --verbose [opt] 指定输出详细信息。,不指定,则不输出详细信息。\n" |
| << " -n or nodetail [opt] 仅输出总结信息。\n" |
| << " -o or --out [opt] 指定输出文件名,不指定,则以时间为文件名。\n" |
| << " -e or --ext [opt] 指定图片数据的后缀名,默认为tif,不需要输入 \".\"。\n" |
| << " --random [opt] 实现随机读取,不指定则为顺序读。\n" |
| << "示例:\n"; |
| #else |
| cout << "Description:\n" |
| << " -p or --path Specified the path.\n" |
| << " -r or recursive [opt] Recursive search for files within a sub folder.\n" |
| << " -m or --mode Specifies the reading mode, there are three modes: 1 2 3.\n" |
| << " -t or --thread [opt] thread number, the maximum is 300.\n" |
| << " -d or --deap [opt] Set the depth of reading layer by layer.\n" |
| << " -l or --layer [opt] Set the specified layer.\n" |
| << " -v or --verbose [opt] Output details\n" |
| << " -n or nodetail [opt] Only output summary information\n" |
| << " -o or --out [opt] Specify the output file name.If you do not specify a file\n" |
| << " -e or --ext [opt] specifies the file extension (default is TIF), do not need to add \".\".\n" |
| << " --random [opt] Implementation of random read.\n" |
| << "Examples:\n"; |
| #endif |
| cout << " gdalread -p D:\\test -m 1 \n" |
| << " gdalread -p D:\\test -m 1 -o out1.txt -e jpg \n" |
| << " gdalread -p D:\\test -m 2 \n" |
| << " gdalread -p D:\\test -m 3 \n" |
| << " gdalread -p D:\\test -m 3 -t 4 \n" |
| << " gdalread -p D:\\test -m 3 -t 4 -d 4 \n" |
| << " gdalread -p D:\\test -m 3 -t 4 -l 4 \n"; |
| exit(0); |
| } |
| |
| |
| |
| |
| |
| int compare(const TASKGROUP &a, const TASKGROUP &b) |
| { |
| return a.at(0).rand > b.at(0).rand; |
| } |
| |
| #include <algorithm> |
| int main(int argc, char ** argv) |
| { |
| GDALAllRegister(); |
| int bHaveUnknownPara = 0; |
| int opt = 0; |
| int longIndex = 0; |
| |
| if (argc == 1) |
| helpinfo(); |
| |
| opt = getopt_long(argc, argv, optString, longOpts, &longIndex); |
| |
| while (opt != -1) |
| { |
| switch (opt) |
| { |
| case 'p': |
| f_ExitIfTure(optarg[0] == '-', (string("option -") + (char)opt + " requiers an argument.").c_str()); |
| oPath = optarg; |
| break; |
| case 'm': |
| f_ExitIfTure(optarg[0] == '-', (string("option -") + (char)opt + " requiers an argument.").c_str()); |
| oMode = optarg; |
| break; |
| case 'd': |
| f_ExitIfTure(optarg[0] == '-', (string("option -") + (char)opt + " requiers an argument.").c_str()); |
| deapth = atoi(optarg); |
| break; |
| case 'l': |
| f_ExitIfTure(optarg[0] == '-', (string("option -") + (char)opt + " requiers an argument.").c_str()); |
| setedlayer = atoi(optarg); |
| break; |
| case 'o': |
| f_ExitIfTure(optarg[0] == '-', (string("option -") + (char)opt + " requiers an argument.").c_str()); |
| oOutFile = optarg; |
| break; |
| case 'e': |
| f_ExitIfTure(optarg[0] == '-', (string("option -") + (char)opt + " requiers an argument.").c_str()); |
| oFileExt = optarg; |
| break; |
| case 't': |
| f_ExitIfTure(optarg[0] == '-', (string("option -") + (char)opt + " requiers an argument.").c_str()); |
| threads = atoi(optarg); |
| break; |
| case 1: |
| bRandom = 1; |
| break; |
| case 'r': |
| recursive = 1; |
| break; |
| case 'n': |
| nodetail = 1; |
| break; |
| case 'v': |
| verbose = 1; |
| break; |
| case '?': |
| case ':': |
| case 'h': |
| helpinfo(); |
| return 0; |
| break; |
| default: |
| |
| break; |
| } |
| opt = getopt_long(argc, argv, optString, longOpts, &longIndex); |
| } |
| |
| f_ExitIfTure(oPath.empty(), "please input path name, format : -p pathname"); |
| f_ExitIfTure(oMode.empty(), "please input file name, format : -f filename"); |
| |
| srand((unsigned)time(NULL)); |
| |
| #ifdef WIN32 |
| if (oPath[oPath.length() - 1] != '\\') |
| oPath += '\\'; |
| #else |
| if (oPath[oPath.length() - 1] != '/') |
| oPath += '/'; |
| #endif |
| pszLocalPath = oPath.c_str(); |
| |
| if (oMode == "whole" || oMode == "1") |
| mode = 1; |
| else if (oMode == "512" || oMode == "2") |
| mode = 2; |
| else if (oMode == "3") |
| mode = 3; |
| else{ |
| cout << "Mode ERROR!" << endl; |
| return 1; |
| } |
| |
| if (oOutFile.empty()) |
| oOutFile = (CPLString)DateTimeStr() + ".txt"; |
| |
| if (oFileExt.empty()) |
| oFileExt = ".tif"; |
| else |
| oFileExt = '.' + oFileExt; |
| if (deapth == 0) |
| deapth = 100; |
| |
| |
| getFiles(pszLocalPath, files); |
| for (vector<string>::iterator iter = files.begin(); iter != files.end();){ |
| CPLString ext = (*iter).c_str() + (*iter).find_last_of('.'); |
| if (ext != oFileExt){ |
| iter = files.erase(iter); |
| continue; |
| } |
| iter++; |
| } |
| file_num = files.size(); |
| |
| |
| |
| coutBuf = cout.rdbuf(); |
| of.open(oOutFile.c_str(), ios::app); |
| if (of.fail()){ |
| cout << "Unable to create file: " << oOutFile << ", the file name can not contain\" \\ / : * ? \" < > | \"" << endl; |
| exit(1); |
| } |
| fileBuf = of.rdbuf(); |
| |
| |
| long timeuse_ms; |
| #ifdef WIN32 |
| |
| LARGE_INTEGER nTime1, nTime2, tc; |
| QueryPerformanceFrequency(&tc); |
| QueryPerformanceCounter(&nTime1); |
| |
| #else |
| struct timeval t1, t2; |
| gettimeofday(&t1, NULL); |
| #endif |
| |
| if (threads == 0) |
| threads = 1; |
| if (mode == 2 || mode == 3){ |
| for (int i = 0; i < threads; i++) |
| pblock512buff[i] = (GByte *)CPLMalloc(MALLOC521BLOCKSIZE); |
| } |
| |
| GatherFilesInfo(); |
| |
| |
| str_print.append(" Command: gdalread "); |
| for (int i = 1; i < argc; i++) |
| str_print.append(argv[i]).append(" "); |
| char buff[200]; |
| str_print.append("\n File number: "); |
| sprintf(buff, "%d", files.size()); |
| str_print.append(buff); |
| str_print.append("\n Total file size: "); |
| sprintf(buff, "%d", TotalFilesSize / (1024 * 1024)); |
| str_print.append(buff).append("M -- "); |
| sprintf(buff, "%.3f", TotalFilesSize * 1.0 / (1024 * 1024 * 1024)); |
| str_print.append(buff).append("G\n"); |
| str_print.append(SPLITLINE).append("\n "); |
| sprintf(buff, "%-40s", "FILE_NAME"); str_print.append(buff); |
| sprintf(buff, "%-6s", "PID"); str_print.append(buff); |
| sprintf(buff, "%-8s", "SIZE/M"); str_print.append(buff); |
| sprintf(buff, "%-18s", "X*Y/BANDS/DEAP"); str_print.append(buff); |
| sprintf(buff, "%-7s", "LAYER"); str_print.append(buff); |
| sprintf(buff, "%-42s", "EXTRACTION"); str_print.append(buff); |
| sprintf(buff, "%-10s", "TIME/sec"); str_print.append(buff); |
| sprintf(buff, "%-10s", "SPEED M/s\n"); str_print.append(buff); |
| |
| |
| |
| if (mode == 1){ |
| AssignTask_mode1(); |
| if (bRandom == 1) |
| sort(AllTask.begin(), AllTask.end(), compare); |
| StartThread(); |
| WaitUntilFinished(); |
| } |
| else if (mode == 2){ |
| AssignTask_mode2(); |
| if (bRandom == 1) |
| sort(AllTask.begin(), AllTask.end(), compare); |
| StartThread(); |
| WaitUntilFinished(); |
| } |
| else if (mode == 3){ |
| if (setedlayer == 0){ |
| curlayer = 1; |
| while (curlayer <= deapth && AssignTask_mode3(curlayer) != 0){ |
| if (bRandom == 1) |
| sort(AllTask.begin(), AllTask.end(), compare); |
| |
| |
| long timeuse_ms_lt; |
| #ifdef WIN32 |
| LARGE_INTEGER nTime1_lt, nTime2_lt, tc_lt; |
| QueryPerformanceFrequency(&tc_lt); |
| QueryPerformanceCounter(&nTime1_lt); |
| #else |
| struct timeval t1_lt, t2_lt; |
| gettimeofday(&t1_lt, NULL); |
| #endif |
| |
| taskg_num = 0; |
| ThreadRetFlagPos = 0; |
| memset(ThreadRetFlag, 0, MAXTHREADNUM); |
| StartThread(); |
| WaitUntilFinished(); |
| curlayer++; |
| |
| #ifdef WIN32 |
| QueryPerformanceCounter(&nTime2_lt); |
| timeuse_ms_lt = (nTime2_lt.QuadPart - nTime1_lt.QuadPart)*1000.0 / tc_lt.QuadPart; |
| #else |
| gettimeofday(&t2_lt, NULL); |
| timeuse_ms_lt = (t2_lt.tv_sec - t1_lt.tv_sec) * 1000 + (t2_lt.tv_usec - t1_lt.tv_usec) / 1000; |
| #endif |
| |
| char buff[200]; |
| sprintf(buff, " Time consumpted of this layer is: %.3f seconds.\n\n", timeuse_ms_lt / 1000.0); |
| str_print.append(buff); |
| } |
| } |
| else{ |
| curlayer = setedlayer; |
| if (AssignTask_mode3(setedlayer) != 0){ |
| if (bRandom == 1) |
| sort(AllTask.begin(), AllTask.end(), compare); |
| StartThread(); |
| WaitUntilFinished(); |
| } |
| } |
| } |
| |
| |
| #ifdef WIN32 |
| QueryPerformanceCounter(&nTime2); |
| timeuse_ms = (nTime2.QuadPart - nTime1.QuadPart)*1000.0 / tc.QuadPart; |
| #else |
| gettimeofday(&t2, NULL); |
| timeuse_ms = (t2.tv_sec - t1.tv_sec) * 1000 + (t2.tv_usec - t1.tv_usec) / 1000; |
| #endif |
| |
| |
| |
| if (mode == 2 || mode == 3){ |
| for (int i = 0; i < threads; i++) |
| CPLFree(pblock512buff[i]); |
| } |
| CPLString sum_print; |
| |
| sprintf(buff, "\n The Total Time Cost is :%.3f seconds. \n", timeuse_ms / 1000.0); |
| sum_print.append(buff); |
| |
| if (mode == 1 || mode == 2){ |
| sprintf(buff, " The Average Read Speed is :%.3f M/s.\n", (TotalFilesSize * 1.0 / (1024 * 1024)) / (timeuse_ms / 1000.0)); |
| sum_print.append(buff); |
| } |
| sum_print.append(" ---Finished!---\n"); |
| cout << sum_print; |
| |
| cout.rdbuf(fileBuf); |
| cout << sum_print; |
| of.flush(); |
| of.close(); |
| cout.rdbuf(coutBuf); |
| |
| return 0; |
| } |
| |
| |
| |
| |
| |
| void WaitUntilFinished(void) |
| { |
| bool bFinished = 0; |
| while (bFinished == 0){ |
| bFinished = 1; |
| for (int i = 0; i < threads; i++){ |
| if (ThreadRetFlag[i] == 0) |
| bFinished = 0; |
| } |
| |
| #define BUFFSIZE_L 1024000 |
| static char buff[BUFFSIZE_L]; |
| int curpos = str_print.size(); |
| if (curpos < BUFFSIZE_L && str_print_pos < curpos - 1){ |
| CPLSleep(0.001); |
| memcpy(buff, str_print.c_str() + str_print_pos, curpos - str_print_pos); |
| buff[curpos - str_print_pos] = 0; |
| cout << buff; |
| |
| cout.rdbuf(fileBuf); |
| cout << buff; |
| of.flush(); |
| cout.rdbuf(coutBuf); |
| |
| str_print_pos = curpos; |
| } |
| } |
| } |
| |
| |
| |
| |
| |
| void StartThread(void) |
| { |
| for (int i = 0; i < threads; i++){ |
| CPLCreateThread(PerformThread, NULL); |
| CPLSleep(0.025); |
| } |
| } |
| |
| |
| |
| |
| |
| static CPLMutex *hMutex = NULL; |
| static CPLMutex *hMutex2 = NULL; |
| |
| void PerformThread(void* parg) |
| |
| { |
| TASKGROUP CurrTaskGroup; |
| int curr_num; |
| GIntBig PID = CPLGetPID(); |
| |
| CPLCreateOrAcquireMutex(&hMutex, 0); |
| int ThisThreadRetFlagPos = ThreadRetFlagPos++; |
| CPLReleaseMutex(hMutex); |
| |
| GByte * pafScanline = NULL; |
| |
| if (mode == 2 || mode == 3) |
| pafScanline = pblock512buff[ThisThreadRetFlagPos]; |
| |
| GDALDataset* poDataset = NULL; |
| const char* last_filepath = NULL; |
| |
| while (1){ |
| |
| CPLCreateOrAcquireMutex(&hMutex2, 0); |
| if (taskg_num > AllTask.size() - 1){ |
| CPLReleaseMutex(hMutex2); |
| ThreadRetFlag[ThisThreadRetFlagPos] = 1; |
| return; |
| } |
| CurrTaskGroup = AllTask.at(taskg_num++); |
| |
| CPLReleaseMutex(hMutex2); |
| |
| if (mode == 1) |
| pafScanline = (GByte *)CPLMalloc(CurrTaskGroup.at(0).SIZE_OUT_X * CurrTaskGroup.at(0).SIZE_OUT_Y*CurrTaskGroup.at(0).bands*CurrTaskGroup.at(0).deap); |
| |
| if (CurrTaskGroup.at(0).filepath != last_filepath){ |
| poDataset = (GDALDataset*)GDALOpen(CurrTaskGroup.at(0).filepath, GA_ReadOnly); |
| last_filepath = CurrTaskGroup.at(0).filepath; |
| } |
| |
| |
| float timeuse_ms_g; |
| #ifdef WIN32 |
| LARGE_INTEGER nTime1_g, nTime2_g, tc_g; |
| #else |
| struct timeval t1_g, t2_g; |
| #endif |
| if (nodetail == 0 && verbose == 0){ |
| |
| #ifdef WIN32 |
| QueryPerformanceFrequency(&tc_g); |
| QueryPerformanceCounter(&nTime1_g); |
| #else |
| gettimeofday(&t1_g, NULL); |
| #endif |
| } |
| |
| for (int i = 0; i < CurrTaskGroup.size(); i++){ |
| float timeuse_ms_s; |
| #ifdef WIN32 |
| LARGE_INTEGER nTime1_s, nTime2_s, tc_s; |
| #else |
| struct timeval t1_s, t2_s; |
| #endif |
| if (nodetail == 0 && verbose == 1){ |
| |
| #ifdef WIN32 |
| QueryPerformanceFrequency(&tc_s); |
| QueryPerformanceCounter(&nTime1_s); |
| #else |
| gettimeofday(&t1_s, NULL); |
| #endif |
| } |
| CPLErr err = poDataset->RasterIO(GF_Read, CurrTaskGroup.at(i).START_X, CurrTaskGroup.at(i).START_Y, \ |
| CurrTaskGroup.at(i).SIZE_X, CurrTaskGroup.at(i).SIZE_Y, \ |
| pafScanline, CurrTaskGroup.at(i).SIZE_OUT_X, CurrTaskGroup.at(i).SIZE_OUT_Y, \ |
| GDALDataType(CurrTaskGroup.at(i).deap), CurrTaskGroup.at(i).bands, bound_map, 0, 0, 0); |
| if (nodetail == 0 && verbose == 1){ |
| |
| #ifdef WIN32 |
| QueryPerformanceCounter(&nTime2_s); |
| timeuse_ms_s = (nTime2_s.QuadPart - nTime1_s.QuadPart)*1000.0 / tc_s.QuadPart; |
| #else |
| gettimeofday(&t2_s, NULL); |
| timeuse_ms_s = (t2_s.tv_sec - t1_s.tv_sec) * 1000 + (t2_s.tv_usec - t1_s.tv_usec) / 1000; |
| #endif |
| |
| CPLString osOut; |
| TaskOutput(&CurrTaskGroup.at(i), timeuse_ms_s, osOut, PID); |
| str_print.append(osOut.c_str()); |
| } |
| } |
| |
| if (nodetail == 0 && verbose == 0){ |
| |
| #ifdef WIN32 |
| QueryPerformanceCounter(&nTime2_g); |
| timeuse_ms_g = (nTime2_g.QuadPart - nTime1_g.QuadPart)*1000.0 / tc_g.QuadPart; |
| #else |
| gettimeofday(&t2_g, NULL); |
| timeuse_ms_g = (t2_g.tv_sec - t1_g.tv_sec) * 1000 + (t2_g.tv_usec - t1_g.tv_usec) / 1000; |
| #endif |
| |
| CPLString osOut; |
| TaskGroupOutput(&CurrTaskGroup, timeuse_ms_g, osOut, PID); |
| str_print.append(osOut.c_str()); |
| } |
| |
| if (mode == 1){ |
| CPLFree(pafScanline); |
| pafScanline = NULL; |
| } |
| } |
| } |
| |
| |
| |
| |
| void TaskGroupOutput(TASKGROUP* taskg, float timeuse_ms, CPLString & osOut, GIntBig PID) |
| { |
| osOut.clear(); |
| char buff[100]; |
| |
| osOut.append(" "); |
| sprintf(buff, "%-40.38s", CPLGetFilename(taskg->at(0).filepath)); osOut.append(buff); |
| sprintf(buff, "%-6d", PID); osOut.append(buff); |
| sprintf(buff, "%-8s", ""); osOut.append(buff); |
| |
| sprintf(buff, "%d", taskg->at(0).f_sizex); |
| string of_xyb = buff; |
| sprintf(buff, "%d", taskg->at(0).f_sizey); |
| of_xyb = of_xyb + '*' + buff + '/'; |
| sprintf(buff, "%d", taskg->at(0).bands); |
| of_xyb = of_xyb + buff + '/'; |
| sprintf(buff, "%d", taskg->at(0).deap); |
| of_xyb = of_xyb + buff; |
| |
| sprintf(buff, "%-18.18s", of_xyb.c_str()); osOut.append(buff); |
| |
| if (mode == 3){ |
| sprintf(buff, "%-7d", curlayer); osOut.append(buff); |
| } |
| else if (mode == 1 || mode == 2){ |
| sprintf(buff, "%-7s", ""); osOut.append(buff); |
| } |
| |
| sprintf(buff, "%d", taskg->size()); |
| string of_extr = buff; of_extr += "*"; |
| sprintf(buff, "(%d", taskg->at(0).START_X); |
| of_extr = of_extr + buff; |
| sprintf(buff, "%d", taskg->at(0).START_Y); |
| of_extr = of_extr + ',' + buff + "):("; |
| sprintf(buff, "%d", taskg->at(0).SIZE_X); |
| of_extr = of_extr + buff + '*'; |
| sprintf(buff, "%d", taskg->at(0).SIZE_Y); |
| of_extr = of_extr + buff + ")->("; |
| sprintf(buff, "%d", taskg->at(0).SIZE_OUT_X); |
| of_extr = of_extr + buff + "*"; |
| sprintf(buff, "%d", taskg->at(0).SIZE_OUT_Y); |
| of_extr = of_extr + buff + ")"; |
| |
| sprintf(buff, "%-42.40s", of_extr.c_str()); osOut.append(buff); |
| sprintf(buff, "%-10.3f", timeuse_ms / 1000.0); osOut.append(buff); |
| |
| if (mode == 1 || mode == 2){ |
| unsigned long amount = taskg->size() * taskg->at(0).SIZE_X * taskg->at(0).SIZE_Y * taskg->at(0).bands * taskg->at(0).deap; |
| float speed = amount * 1000.0 / (1024 * 1024 * timeuse_ms); |
| sprintf(buff, "%-10.1f\n", speed); |
| } |
| else{ |
| sprintf(buff, "%-10.1s\n", ""); |
| } |
| osOut.append(buff); |
| |
| } |
| |
| |
| |
| |
| void TaskOutput(TASK* task, float timeuse_ms, CPLString & osOut, GIntBig PID) |
| { |
| osOut.clear(); |
| char buff[100]; |
| |
| osOut.append(" "); |
| sprintf(buff, "%-40.38s", CPLGetFilename(task->filepath)); osOut.append(buff); |
| sprintf(buff, "%-6d", PID); osOut.append(buff); |
| sprintf(buff, "%-8s", ""); osOut.append(buff); |
| |
| sprintf(buff, "%d", task->f_sizex); |
| string of_xyb = buff; |
| sprintf(buff, "%d", task->f_sizey); |
| of_xyb = of_xyb + '*' + buff + '/'; |
| sprintf(buff, "%d", task->bands); |
| of_xyb = of_xyb + buff + '/'; |
| sprintf(buff, "%d", task->deap); |
| of_xyb = of_xyb + buff; |
| |
| sprintf(buff, "%-18.18s", of_xyb.c_str()); osOut.append(buff); |
| |
| if (mode == 3){ |
| sprintf(buff, "%-7d", curlayer); osOut.append(buff); |
| } |
| else if (mode == 1 || mode == 2){ |
| sprintf(buff, "%-7s", ""); osOut.append(buff); |
| } |
| |
| |
| sprintf(buff, "(%d", task->START_X); |
| string of_extr = buff; |
| sprintf(buff, "%d", task->START_Y); |
| of_extr = of_extr + ',' + buff + "):("; |
| sprintf(buff, "%d", task->SIZE_X); |
| of_extr = of_extr + buff + '*'; |
| sprintf(buff, "%d", task->SIZE_Y); |
| of_extr = of_extr + buff + ")->("; |
| sprintf(buff, "%d", task->SIZE_OUT_X); |
| of_extr = of_extr + buff + "*"; |
| sprintf(buff, "%d", task->SIZE_OUT_Y); |
| of_extr = of_extr + buff + ")"; |
| |
| sprintf(buff, "%-42.40s", of_extr.c_str()); osOut.append(buff); |
| sprintf(buff, "%-10.3f", timeuse_ms / 1000.0); osOut.append(buff); |
| |
| if (mode == 1 || mode == 2){ |
| unsigned long amount = task->SIZE_X * task->SIZE_Y * task->bands * task->deap; |
| float speed = amount * 1000.0 / (1024 * 1024 * timeuse_ms); |
| sprintf(buff, "%-10.1f\n", speed); |
| } |
| else{ |
| sprintf(buff, "%-10.1s\n", ""); |
| } |
| osOut.append(buff); |
| |
| } |
| |
| |
| |
| |
| |
| void GatherFilesInfo(void) |
| { |
| info Info; |
| vector<info>::iterator infoiter; |
| for (vector<string>::iterator iter = files.begin(); iter != files.end(); iter++){ |
| |
| Info.filepath = (*iter).c_str(); |
| |
| VSILFILE *fpL = NULL; |
| fpL = VSIFOpenL((*iter).c_str(), "rb"); |
| if (fpL == NULL) |
| { |
| cout << "VSIFOpenL(...) Open File: " << (*iter).c_str() << " Failed!" << endl; |
| exit(1); |
| } |
| GUIntBig nFileSize; |
| VSIFSeekL(fpL, 0, SEEK_END); |
| nFileSize = VSIFTellL(fpL); |
| VSIFCloseL(fpL); |
| fpL = NULL; |
| Info.SIZE = nFileSize; |
| TotalFilesSize += nFileSize; |
| |
| GDALDataset *poDataset; |
| poDataset = (GDALDataset*)GDALOpen((*iter).c_str(), GA_ReadOnly); |
| |
| if (!poDataset){ |
| cout << "GDALOpen(...) Open File: " << (*iter).c_str() << " Failed!" << endl; |
| exit(1); |
| } |
| |
| Info.bands = poDataset->GetRasterCount(); |
| Info.SIZE_X = poDataset->GetRasterXSize(); |
| Info.SIZE_Y = poDataset->GetRasterYSize(); |
| Info.deap = poDataset->GetRasterBand(1)->GetRasterDataType(); |
| |
| infoiter = FilesInfo.insert(FilesInfo.end(), Info); |
| } |
| } |
| |
| |
| |
| |
| void AssignTask_mode1(void) |
| { |
| TASK task; |
| TASKGROUP taskg; |
| vector<TASK>::iterator iter_taskg; |
| vector<TASKGROUP>::iterator iter_atask; |
| |
| for (vector<info>::iterator iter = FilesInfo.begin(); iter != FilesInfo.end(); iter++){ |
| task.filepath = (*iter).filepath; |
| if ((*iter).SIZE > MAXBUFSIZE){ |
| task.START_X = 0; |
| task.SIZE_X = (*iter).SIZE_X; |
| task.SIZE_OUT_X = (*iter).SIZE_X; |
| int SIZE_Y_R = MAXBUFSIZE / ((*iter).SIZE_X *(*iter).bands * (*iter).deap); |
| |
| for (int i = 0; i <= (*iter).SIZE_Y / SIZE_Y_R; i++){ |
| task.START_Y = SIZE_Y_R * i; |
| task.SIZE_Y = SIZE_Y_R; |
| if (i == (*iter).SIZE_Y / SIZE_Y_R) |
| task.SIZE_Y = (*iter).SIZE_Y % SIZE_Y_R; |
| task.SIZE_OUT_Y = task.SIZE_Y; |
| task.bands = (*iter).bands; |
| task.deap = (*iter).deap; |
| task.rand = rand(); |
| task.f_sizex = (*iter).SIZE_X; |
| task.f_sizey = (*iter).SIZE_Y; |
| taskg.clear(); |
| iter_taskg = taskg.insert(taskg.end(), task); |
| iter_atask = AllTask.insert(AllTask.end(), taskg); |
| } |
| } |
| else{ |
| task.START_X = task.START_Y = 0; |
| task.SIZE_X = (*iter).SIZE_X; |
| task.SIZE_Y = (*iter).SIZE_Y; |
| task.SIZE_OUT_X = (*iter).SIZE_X; |
| task.SIZE_OUT_Y = (*iter).SIZE_Y; |
| task.bands = (*iter).bands; |
| task.deap = (*iter).deap; |
| task.rand = rand(); |
| task.f_sizex = (*iter).SIZE_X; |
| task.f_sizey = (*iter).SIZE_Y; |
| taskg.clear(); |
| iter_taskg = taskg.insert(taskg.end(), task); |
| iter_atask = AllTask.insert(AllTask.end(), taskg); |
| } |
| } |
| } |
| |
| |
| |
| |
| void AssignTask_mode2(void) |
| { |
| TASK task; |
| TASKGROUP taskg; |
| vector<TASK>::iterator iter_taskg; |
| vector<TASKGROUP>::iterator iter_atask; |
| |
| for (vector<info>::iterator iter = FilesInfo.begin(); iter != FilesInfo.end(); iter++){ |
| task.filepath = (*iter).filepath; |
| for (int iy = 0; iy <= (*iter).SIZE_Y / 512; iy++){ |
| taskg.clear(); |
| for (int ix = 0; ix <= (*iter).SIZE_X / 512; ix++) |
| { |
| ix == (*iter).SIZE_X / 512 ? task.SIZE_X = (*iter).SIZE_X % 512 : task.SIZE_X = 512; |
| iy == (*iter).SIZE_Y / 512 ? task.SIZE_Y = (*iter).SIZE_Y % 512 : task.SIZE_Y = 512; |
| task.START_X = 512 * ix; |
| task.START_Y = 512 * iy; |
| task.SIZE_OUT_X = task.SIZE_X; |
| task.SIZE_OUT_Y = task.SIZE_Y; |
| task.bands = (*iter).bands; |
| task.deap = (*iter).deap; |
| task.rand = rand(); |
| task.f_sizex = (*iter).SIZE_X; |
| task.f_sizey = (*iter).SIZE_Y; |
| iter_taskg = taskg.insert(taskg.end(), task); |
| } |
| iter_atask = AllTask.insert(AllTask.end(), taskg); |
| } |
| } |
| } |
| |
| |
| |
| |
| |
| int AssignTask_mode3(int count) |
| { |
| TASK task; |
| TASKGROUP taskg; |
| vector<TASK>::iterator iter_taskg; |
| vector<TASKGROUP>::iterator iter_atask; |
| int times = pow(2, count - 1); |
| int taskg_count = 0; |
| |
| AllTask.clear(); |
| for (vector<info>::iterator iter = FilesInfo.begin(); iter != FilesInfo.end(); iter++){ |
| task.filepath = (*iter).filepath; |
| int maxXY = (*iter).SIZE_X > (*iter).SIZE_Y ? (*iter).SIZE_X : (*iter).SIZE_Y; |
| int stepleng = maxXY / times; |
| |
| if (stepleng <= 512 / 2) |
| continue; |
| |
| if (count == 1){ |
| task.START_X = 0; |
| task.START_Y = 0; |
| task.SIZE_X = (*iter).SIZE_X; |
| task.SIZE_Y = (*iter).SIZE_Y; |
| task.SIZE_OUT_X = 512 * task.SIZE_X / maxXY; |
| task.SIZE_OUT_Y = 512 * task.SIZE_Y / maxXY; |
| task.bands = (*iter).bands; |
| task.deap = (*iter).deap; |
| task.rand = rand(); |
| task.f_sizex = (*iter).SIZE_X; |
| task.f_sizey = (*iter).SIZE_Y; |
| taskg.clear(); |
| iter_taskg = taskg.insert(taskg.end(), task); |
| iter_atask = AllTask.insert(AllTask.end(), taskg); |
| taskg_count++; |
| } |
| else{ |
| for (int iy = 0; iy <= ((*iter).SIZE_Y - 1) / stepleng && iy < times; iy++){ |
| taskg.clear(); |
| for (int ix = 0; ix <= ((*iter).SIZE_X - 1) / stepleng && ix < times; ix++){ |
| task.START_X = stepleng * ix; |
| task.START_Y = stepleng * iy; |
| |
| if (ix == ((*iter).SIZE_X - 1) / stepleng){ |
| task.SIZE_X = ((*iter).SIZE_X - 1) % stepleng + 1; |
| task.SIZE_OUT_X = 512 * task.SIZE_X / stepleng; |
| } |
| else{ |
| task.SIZE_X = stepleng; |
| task.SIZE_OUT_X = 512; |
| } |
| |
| if (iy == ((*iter).SIZE_Y - 1) / stepleng){ |
| task.SIZE_Y = ((*iter).SIZE_Y - 1) % stepleng + 1; |
| task.SIZE_OUT_Y = 512 * task.SIZE_Y / stepleng; |
| } |
| else{ |
| task.SIZE_Y = stepleng; |
| task.SIZE_OUT_Y = 512; |
| } |
| task.bands = (*iter).bands; |
| task.deap = (*iter).deap; |
| task.rand = rand(); |
| task.f_sizex = (*iter).SIZE_X; |
| task.f_sizey = (*iter).SIZE_Y; |
| iter_taskg = taskg.insert(taskg.end(), task); |
| } |
| iter_atask = AllTask.insert(AllTask.end(), taskg); |
| taskg_count++; |
| } |
| } |
| } |
| return taskg_count; |
| } |
| |
| |
| |
| |
| void f_ExitIfTure(int val, const char* pstr) |
| { |
| if (val == 1){ |
| cout << "ERROR! " << (pstr ? pstr : "") << endl; |
| exit(1); |
| return; |
| } |
| } |
| |
| |
| |
| |
| #ifdef WIN32 |
| void getFiles(string path, vector<string>& files) |
| { |
| if (path.at(path.length() - 1) == '\\') |
| path.erase(path.length() - 1); |
| long hFile = 0; |
| struct _finddata_t fileinfo; |
| string p; |
| if ((hFile = _findfirst(p.assign(path).append("\\*").c_str(), &fileinfo)) != -1) |
| { |
| do |
| { |
| if ((fileinfo.attrib & _A_SUBDIR) && recursive == 1) |
| { |
| if (strcmp(fileinfo.name, ".") != 0 && strcmp(fileinfo.name, "..") != 0) |
| getFiles(p.assign(path).append("\\").append(fileinfo.name), files); |
| } |
| else |
| { |
| files.push_back(p.assign(path).append("\\").append(fileinfo.name)); |
| } |
| } while (_findnext(hFile, &fileinfo) == 0); |
| _findclose(hFile); |
| } |
| } |
| #else |
| void getFiles(string o_path, vector<string>& files) |
| { |
| if (o_path.at(o_path.length() - 1) == '/') |
| o_path.erase(o_path.length() - 1); |
| const char *path = o_path.c_str(); |
| DIR *pDir; |
| struct dirent *ent; |
| int i = 0; |
| char childpath[512]; |
| |
| pDir = opendir(path); |
| memset(childpath, 0, sizeof(childpath)); |
| string p; |
| while ((ent = readdir(pDir)) != NULL){ |
| if (ent->d_type & DT_DIR && recursive == 1){ |
| if (strcmp(ent->d_name, ".") == 0 || strcmp(ent->d_name, "..") == 0) |
| continue; |
| sprintf(childpath, "%s/%s", path, ent->d_name); |
| getFiles(childpath, files); |
| } |
| else { |
| files.push_back(p.assign(path).append("/").append(ent->d_name)); |
| } |
| } |
| } |
| |
| #endif |
| |
| |
| |
| |
| char* DateTimeStr(void) |
| { |
| time_t rawtime; |
| struct tm* timeinfo; |
| time(&rawtime); |
| timeinfo = localtime(&rawtime); |
| strftime(timE, 80, "%Y-%m-%d_%H-%M-%S", timeinfo); |
| return timE; |
| } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理