【发布时间】:2014-10-16 14:17:57
【问题描述】:
在下面的代码中,我试图找到 fileA 中第二列具有相同值的行的频率。 (每行有两列,都是整数。)fileA的样本:
1 22
8 3
9 3
我必须像这样在 fileB 中写入输出:
22 1
3 2
因为元素 22 在第二列中重复了一次(并且 3 重复了 2 次。)
fileA 非常大(30G)。其中有 41,000,000 个元素(换句话说,fileB 有 41,000,000 行)。这是我写的代码:
void function(){
unsigned long int size = 41000000;
int* inDeg = new int[size];
for(int i=0 ; i<size; i++)
{
inDeg[i] = 0;
}
ifstream input;
input.open("/home/fileA");
ofstream output;
output.open("/home/fileB");
int a,b;
while(!input.eof())
{
input>>a>>b;
inDeg[b]++; //<------getting error here.
}
input.close();
for(int i=0 ; i<size; i++)
{
output<<i<<"\t"<<inDeg[i]<<endl;
}
output.close();
delete[] inDeg;
}
我在 while 循环的第二行遇到分段错误错误。第 547387 次迭代。我已经根据this给栈内存分配了600M。我正在使用 gcc 4.8.2(在 Mint17 x86_64 上)。
已解决
我彻底分析了fileA。 hyde 提到的问题的原因与硬件无关。 Segfault 原因是索引错误。将大小更改为 61,500,000 解决了我的问题。
【问题讨论】:
-
数组索引从 0 开始,而不是 1。
inDeg[size]不指向您分配的内存。eof()设置在您阅读之后,而不是之前。你在错误的地方检查它。 -
文件中b值没有0元素,都小于41000000吧?
-
当崩溃发生时
b是什么? -
Cameron: 数组的索引不是这里的情况。我用正确的索引重写了代码。仍然是同样的问题。 @crashmstr:实际上我的代码中大小的实际值是:40171637。在错误时 b=40172544
-
while(!input.eof())这是错误的stackoverflow.com/questions/5605125/…
标签: c++ gcc segmentation-fault