C++でifstreamを使って大きなファイル(〜5GB)を読み込もうとしています。 私は64ビットOSなので、これは問題ではないと思っていました。 まだ、私はsegfaultを取得します。小さなファイルではすべてがうまく動作します。 だから問題はどこにあるのでしょうか。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
ラインで187664です。 Tはfloatであり、一度にdim = 1000浮動小数点数を読み取っています。 segfaultが発生すると、i * strideはサイズよりも小さいので、ファイルの最後を過ぎて実行していません。
暗くは
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);
}
どのようにファイルを読み取っていますか、セグメント違反はどこですか? –
関連するコードを投稿してください。 – Joe
'dims 'とは何ですか?どのように割り当てられていますか?あなたは終わりを過ぎて走っていないと確信していますか? – Mat