Я использую следующий код для чтения файла в массив chararcter. Теперь для маленького файла (скажем, для 2 МБ) он выполняется правильно, но для большого файла (140 МБ), на моем сервере UBUNTU на 18 ГБ это дает segmentation fault
, Кто-нибудь может мне помочь, как решить это? Я думаю, что 18 ГБ достаточно для хранения 240 МБ файла в памяти. Я использую 64-битный UBUNTU и компилирую с помощью g ++.
ifstream is;
char chararray [fileSize] ;
is.read(chararray, fileSize) ;
Если массив является локальной переменной, вы получите переполнение стека, так как он не помещается в стек. Вместо этого выделите «массив» в куче, либо напрямую, используя new
или косвенно с помощью std::vector
,
Или используйте отображение памяти. Увидеть mmap
функция.
Вместо того, чтобы размещать массив символов в стеке, я бы попробовал использовать std::vector
который будет динамически распределяться по куча:
std::vector<char> buffer(fileSize);
is.read(&buffer[0], fileSize);
Для этого в компиляторе GCC есть команда по умолчанию, называемая size! Скомпилируйте программу с помощью компилятора GCC. Тогда вы можете получить размер файла!
gcc -Wall test.c
size
Это для нормальной программы на C! Поскольку вы не указали ни одного параметра, он принимает ./a.out в качестве параметра по умолчанию!
Если вам придется применить некоторую оптимизацию, код будет выглядеть следующим образом:
praveenvinny@ubuntu:~/Project/New$> gcc -Wall -o1 -fauto-inc-dec test.c -o Output
praveenvinny@ubuntu:~/Project/New$> size output
text data bss dec hex filename
1067 256 8 1331 533 output
Используйте текстовый раздел для размера кода.
Вы можете использовать data и bss, если вы хотите учитывать и глобальный размер данных.
Это напечатает размер кода,
time -f "%e" -o Output.log ./a.out
напечатает время выполнения в файл журнала, называемый Output.log