我有一个相当标准的循环来从二进制文件中读入:
char* buffer;
if(imageData.is_open())
{
imageData.seekg(0, std::ios::end);
int filelen = imageData.tellg();
entrysize = filelen/(hdrDimensions[0] * hdrDimensions[1] * hdrDimensions[2] * hdrDimensions[3]);
buffer = new char[sizeof(short int)];
if(entrysize == 2)
{
imgDataShort = new std::vector<short int>((hdrDimensions[0] * hdrDimensions[1] * hdrDimensions[2] * hdrDimensions[3]), 0);
imageData.seekg(0, std::ios::beg);
int j(0);
for(int i=0; i < (hdrDimensions[0] * hdrDimensions[1] * hdrDimensions[2] * hdrDimensions[3]); i++)
{
imageData.read(reinterpret_cast<char*>(buffer), sizeof(short int));
memcpy(&(imgDataShort->at(i)), buffer, sizeof(short int));
j += sizeof(short int);
}
}
delete [] buffer;
}
在这种情况下,读取CT图像。我遇到了一个奇怪的问题,即这个循环挂起大约文件的一半(文件是30MB),进入磁盘睡眠状态。我完全不知道为什么会这样。
详细说明:
为了防止它变得很重要,我在运行busybox的Intel XeonPhi卡上运行它,并且正在从nfs mount读取文件。完全相同的代码在“普通”机器上运行良好。我无法控制nfs配置,但如果某些内容被破坏,显然我可以要求修复它。 mount配置行看起来像(取自df -h):
rw,relatime,vers=3,rsize=32768,wsize=32768,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,mountaddr=XXX.XXX.XXX.XXX,mountvers=3,mountport=300,mountproto=udp,local_lock=none,addr=XXX.XXX.XXX.XXX