Чтобы прочитать файл, который будет быстрее — используя fstream, FILE * или отображение памяти?

Вот моя конфигурация проекта: vs2013, win32, Debug.

Я хочу знать для файлов разных размеров, какой из 3 методов чтения файлов будет быстрее. Это fstream в стиле c ++, чтение и запись в стиле c и отображение памяти.

Но после исполнения вот мой результат:

Размер файла 1225284
время потока 47
c указатель времени файла 0
время отображения памяти 0

Размер файла 14856192
время потока 15
c указатель времени файла 0
время отображения памяти 47

Размер файла 97198080
время потока 16
c указатель времени файла 0
время отображения памяти 265

Размер файла 1259530844
время потока 31
c указатель времени файла 16
время отображения памяти 11138

Похоже, что для чтения потоков и файлов FILE * время, необходимое для чтения файла, не будет увеличиваться с увеличением размера файла. Но для отображения памяти это правда. Это явление довольно странное.
Потому что, на мой взгляд, для больших файлов отображение памяти будет быстрее.
Вот мой код:

string ifile = "M:/Thesis/FileReadCmp/1.txt";
string os = "M:/Thesis/FileReadCmp/new_cmp1.txt";
int page_size = 2 * 1024 * 64 * 1024;//128M
for (int j = 0; j < 100; ++j){
os[os.size() - 5] = '1' + j;
ofstream o(os);
for (int i = 0; i < 4; ++i){
ifile[ifile.size() - 5] = '1' + i;
ifstream in(ifile);

in.seekg(0, ios::end);
o << "File Size " << in.tellg() << endl;
o << endl;
in.close();

//using fstream to read file
long long st = GetTickCount();
in.open(ifile);
char c;
while (in >> c){
;
}
in.close();
long long et = GetTickCount();
o << "fstream time " << et - st << endl;

//using FILE* to read file
st = GetTickCount();
FILE* cpf = fopen(ifile.c_str(), "r");
char cc = fgetc(cpf);
while (cc != EOF)
{
cc = fgetc(cpf);
}
fclose(cpf);
et = GetTickCount();
o << "c file pointer time " << et - st << endl;

//using memory mapping to read file
const char* pc = ifile.c_str();
st = GetTickCount();
HANDLE hFile = CreateFile(pc, GENERIC_WRITE | GENERIC_READ, 0,
NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
int file_size = GetFileSize(hFile, NULL);
HANDLE hFileMap = OpenFileMapping(FILE_MAP_READ | FILE_MAP_WRITE, FALSE,
TEXT("SharedData"));

if (hFileMap == NULL){
// if no such object,create a file mapping object
hFileMap = CreateFileMapping(hFile, NULL, PAGE_READWRITE,
0, 0, TEXT("SharedData"));
}

int rem_file_size = file_size;
int offset = 0;
while (rem_file_size > page_size){
PVOID pvFileView = MapViewOfFile(hFileMap, FILE_MAP_WRITE, 0, offset, page_size);
char* asc_dex = (char*)pvFileView;
for (int i = 0; i < page_size; ++i){//, c = 0++c
char c = asc_dex[i];
}
//UnmapViewOfFile(pvFileView);
offset += page_size;
rem_file_size -= page_size;
}
PVOID pvFileView = MapViewOfFile(hFileMap, FILE_MAP_WRITE, 0, offset, rem_file_size);
char* asc_dex = (char*)pvFileView;
for (int i = 0; i < rem_file_size; ++i){//, c = 0++c
char c = asc_dex[i];
}
UnmapViewOfFile(pvFileView);

CloseHandle(hFileMap);
CloseHandle(hFile);

et = GetTickCount();
o << "memory mapping time " << et - st << endl;
o << endl;
}
}

-2

Решение

Самый эффективный метод — поддерживать поток входного потока. Обычно это означает чтение больших блоков данных (больше данных на запрос).

Одним из способов является наличие нескольких буферов (поиск в интернете для «двойной буферизации») и нескольких потоков.

Поток чтения прочитает и заполнит один буфер, а затем сообщит, что данные готовы. Поток чтения переходит к заполнению следующего буфера.

Поток обработки (который ожидал сигнала считывания) активируется и начинает обработку буфера, а затем выводит данные.

Одна из целей состоит в том, чтобы использовать как можно больше больших буферов для настройки скорости чтения данных в зависимости от скорости обработки. Опять же, идея заключается в том, что чтение данных является непрерывным в отношении обработки.

2

Другие решения

Проблема может быть в режиме открытия. Режим отображения памяти по умолчанию является двоичным.

Когда я изменился in.open(ifile); в in.open(ifile, ios::binary);;FILE* cpf = fopen(ifile.c_str(), "r"); в FILE* cpf = fopen(ifile.c_str(), "rb");Реальное время выполнения 3 методов становится в соответствии с теорией. Они заключаются в следующем:

Размер файла 1225284
время потока 297
c указатель времени файла 93
время отображения памяти 0

Размер файла 14856192
Время потока 3167
c указатель времени файла 1045
время отображения памяти 47

Размер файла 97198080
время потока 20779
c указатель времени файла 6833
время отображения памяти 281

Размер файла 1259530844
время потока 268696
c указатель времени файла 88406
время отображения памяти 11216

1

По вопросам рекламы [email protected]