Я пытаюсь прочитать большой файл (~ 5 ГБ), используя ifstream в C ++.Так как я на 64-битной ОС, я подумал, что это не должно быть проблемой.Тем не менее, я получил Segfault.Все отлично работает с небольшими файлами, так что я уверен, что проблема именно в этом.
Я использую g ++ (4.4.5-8) и libstdc ++ 6 (4.4.5-8).
Спасибо.
Код выглядит следующим образом:
void load (const std::string &path, int _dim, int skip = 0, int gap = 0) {
std::ifstream is(path.c_str(), std::ios::binary);
BOOST_VERIFY(is);
is.seekg(0, std::ios::end);
size_t size = is.tellg();
size -= skip;
long int line = sizeof(float) * _dim + gap;
BOOST_VERIFY(size % line == 0);
long int _N = size / line;
reset(_dim, _N);
is.seekg(skip, std::ios::beg);
char *off = dims;
for (long int i = 0; i < N; ++i) {
is.read(off, sizeof(T) * dim);
is.seekg(gap, std::ios::cur);
off += stride;
}
BOOST_VERIFY(is);
}
Сегфоут находится в строке is.read
для i = 187664.T float, и я читаю dim = 1000 float одновременно.Когда происходит segfault, i * stride становится намного меньше размера, поэтому я не пробегаю до конца файла.
dims выделено здесь
void reset (int _dim, int _N)
{
BOOST_ASSERT((ALIGN % sizeof(T)) == 0);
dim = _dim;
N = _N;
stride = dim * sizeof(T) + ALIGN - 1;
stride = stride / ALIGN * ALIGN;
if (dims != NULL) delete[] dims;
dims = (char *)memalign(ALIGN, N * stride);
std::fill(dims, dims + N * stride, 0);
}