int _tmain(int argc, _TCHAR* argv[]) { uint32_t uSize = 5000; // 4gb 이상 가능 LARGE_INTEGER Size; // DWORD bufSize = 2048; // 32bit가 4gb 인데 실질적으로 2gb 사용 가능 // 그러니 최대인 2048M 씩 할당 LARGE_INTEGER offset; // 크기 offset.QuadPart = (LONGLONG)0; StopWatch sw1, sw2; Size.QuadPart = (LONGLONG)(1024 * 1024) * (LONGLONG)uSize;; _ASSERTE(create_very_big_file(L"big.txt", uSize)); sw1.Start(); _ASSERTE(file_copy_using_read_write(L"big.txt", L"big2.txt")); sw1.Stop(); print("info] time elapsed = %f", sw1.GetDurationSecond()); PUCHAR buf = (PUCHAR)malloc(bufSize); sw2.Start(); FileIoHelper Helper; Helper.FIOpenForRead(L"big.txt"); Helper.FIOCreateFile(L"big3.txt", Size); while (offset.QuadPart < Size.QuadPart) { if ((Size.QuadPart - offset.QuadPart) >(LONGLONG)bufSize) bufSize = 2048; else bufSize = (DWORD)(Size.QuadPart - offset.QuadPart); Helper.FIOReadFromFile(offset, bufSize, buf); Helper.FIOWriteToFile(offset, bufSize, buf); offset.QuadPart += (LONGLONG)bufSize; } sw2.Stop(); print("info] time elapsed = %f", sw2.GetDurationSecond()); return 0; }
int _tmain(int argc, _TCHAR* argv[]) { uint32_t goalsize = 6144; // 6GB _ASSERTE(create_very_big_file(L"big.txt",goalsize));//목표크기 6GB만큼 파일 생성 StopWatch sw; sw.Start(); _ASSERTE(file_copy_using_read_write(L"big.txt", L"big2.txt")); sw.Stop(); print("info] (Read Write) time elapsed = %f", sw.GetDurationSecond()); LARGE_INTEGER _Filesize; _Filesize.QuadPart = (LONGLONG)(1024*1024)*(LONGLONG)goalsize;//파일의 크기 6GB 설정하기위해 LARGE_INTEGER DWORD bufS = 4096; // read.write에서 buf가 4096이므로 4096설정 PUCHAR buf = (PUCHAR)malloc(bufS); LARGE_INTEGER _Offset; _Offset.QuadPart = 0; //파일을 옮겨주는 계산을 하는데 사용한다. StopWatch sw2; sw2.Start(); FileIoHelper FileHelp; FileHelp.FIOpenForRead(L"big.txt"); FileHelp.FIOCreateFile(L"big3.txt", _Filesize); while(_Filesize.QuadPart > _Offset.QuadPart) { if((_Filesize.QuadPart - _Offset.QuadPart) > (LONGLONG)bufS) bufS = 4096; else bufS = (DWORD)(_Filesize.QuadPart - _Offset.QuadPart); FileHelp.FIOReadFromFile(_Offset, bufS, buf); FileHelp.FIOWriteToFile(_Offset, bufS, buf); _Offset.QuadPart += (LONGLONG)bufS; } sw2.Stop(); print("info] (Memory Map) time elapsed = %f", sw2.GetDurationSecond()); return 0; }
int _tmain(int argc, _TCHAR* argv[]) { // current directory 를 구한다. wchar_t *buf = NULL; uint32_t buflen = 0; buflen = GetCurrentDirectoryW(buflen, buf); if (0 == buflen) { print("err ] GetCurrentDirectoryW() failed. gle = 0x%08x", GetLastError()); return false; } buf = (PWSTR)malloc(sizeof(WCHAR) * buflen); if (0 == GetCurrentDirectoryW(buflen, buf)) { print("err ] GetCurrentDirectoryW() failed. gle = 0x%08x", GetLastError()); free(buf); return false; } // current dir \\ test.txt 파일명 생성 wchar_t file_name[260]; if (!SUCCEEDED(StringCbPrintfW( file_name, sizeof(file_name), L"%ws\\test.txt", buf))) { print("err ] can not create file name"); free(buf); return false; } // current dir \\ test2.txt 파일명 생성 wchar_t file_name2[260]; if (!SUCCEEDED(StringCbPrintfW( file_name2, sizeof(file_name2), L"%ws\\test2.txt", buf))) { print("err ] can not create file name"); free(buf); return false; } free(buf); buf = NULL; FileIoHelper MMIOFILE; FileIoHelper MMIOFILE2; LARGE_INTEGER file_size; LARGE_INTEGER offset; PUCHAR buff; offset.QuadPart = 0; if (is_file_existsW(file_name)) { MMIOFILE.FIOpenForRead(file_name); file_size = *MMIOFILE.FileSize(); } else { file_size.QuadPart = (unsigned long long)1 * 501 * 1024 * 1024; MMIOFILE.FIOCreateFile(file_name, file_size); } MMIOFILE2.FIOCreateFile(file_name2, file_size); // 복사의 개념과는 약간 다른 것 같지만 복사를 하기 위해 먼저 같은 크기의 파일을 생성한 다음 내부 데이터를 덮어씌우는 형태로 구현하였다. // copy buff = (PUCHAR) malloc((500 * 1024 * 1024 + 1)*sizeof(UCHAR)); while (1) { if (offset.QuadPart + 500 * 1024 * 1024 < file_size.QuadPart) { MMIOFILE.FIOReadFromFile(offset, 500 * 1024 * 1024, buff); MMIOFILE2.FIOWriteToFile(offset, 500 * 1024 * 1024, buff); offset.QuadPart += 500 * 1024 * 1024; } else { MMIOFILE.FIOReadFromFile(offset, file_size.QuadPart - offset.QuadPart, buff); MMIOFILE2.FIOWriteToFile(offset, file_size.QuadPart - offset.QuadPart, buff); offset.QuadPart = file_size.QuadPart; break; } } return 0; }
int _tmain(int argc, _TCHAR* argv[]) { /* _ASSERTE(create_very_big_file(L"big.txt", 5000)); StopWatch sw2; sw2.Start(); _ASSERTE(file_copy_using_memory_map(L"big.txt", L"big3.txt")); sw2.Stop(); print("info] time elapsed = %f", sw2.GetDurationSecond()); StopWatch sw; sw.Start(); _ASSERTE(file_copy_using_read_write(L"big.txt", L"big4.txt")); sw.Stop(); print("info] time elapsed = %f", sw.GetDurationSecond()); */ FileIoHelper Helper; uint64_t size=5000; LARGE_INTEGER file_size; LARGE_INTEGER offset; offset.QuadPart = 0; DWORD bufsize = 2048*1024*1024; PUCHAR buf = (PUCHAR)malloc(bufsize); file_size.QuadPart = (1024 * 1024) * size; _ASSERTE(create_very_big_file(L"big.txt", size)); StopWatch sw2; sw2.Start(); Helper.FIOpenForRead(L"big.txt"); Helper.FIOCreateFile(L"big2.txt", file_size); while (offset.QuadPart < file_size.QuadPart) { if ((file_size.QuadPart - offset.QuadPart) >(LONGLONG)bufsize) { bufsize = 2048*1024*1024; } else { bufsize = (DWORD)(file_size.QuadPart - offset.QuadPart); } Helper.FIOReadFromFile(offset, bufsize, buf); Helper.FIOWriteToFile(offset, bufsize, buf); offset.QuadPart += (LONGLONG)bufsize; } sw2.Stop(); print("info] time elapsed = %f", sw2.GetDurationSecond()); StopWatch sw; sw.Start(); _ASSERTE(file_copy_using_read_write(L"big.txt", L"big3.txt")); sw.Stop(); print("info] time elapsed = %f", sw.GetDurationSecond()); _getwch(); return 0; }