我想在C++中使用ifstream讀取大文件(〜5GB)。 由於我在64位操作系統上,我認爲這不應該是一個問題。 不過,我收到段錯誤。一切運行良好與小文件, 所以我敢肯定,這是問題所在。segfault在讀取64位的ifstream的大文件Debian
我使用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是浮點數,我一次讀dim = 1000浮點數。 當segfault發生時,i * stride小於size,所以我沒有跑過文件的末尾。
變暗這裏
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);
}
你是如何讀取文件的,以及分段錯誤的確切位置? – 2012-02-18 14:29:59
發佈一些相關的代碼。 – Joe 2012-02-18 14:32:13
什麼是dims?如何分配?你確定你沒有跑過去嗎? – Mat 2012-02-18 14:40:49