使用自行实现的burrows-wheeler算法转换文件时,我的程序在读取文件大小超过59 kB的文件时会遇到问题。 基本上我在终端开始我的程序:
./BW encode 4 < test
其中4代表4 * 1024字节。 如前所述,在处理文件大小不超过59 kB的文件(原始数据,文本文件等)时,不会出现任何问题。
处理数据并发送到stdout的代码:
void encodeBlock(unsigned char* str,long length){
unsigned int i, out_rownum;
unsigned char **str_matr, *out_str, *prnt_rt_str2, *prnt_rt_str1;
str_matr = (unsigned char**) calloc(length,sizeof(unsigned char*));
out_str = (unsigned char*) calloc(length+1,sizeof(unsigned char));
// make matrix with rotationstrings of str (by saving pointer to first character)
for(i=0;i<(unsigned int) length;i++){
str_matr[i] = &str[i];
}
// sorting matrix
glob_strt = &str[0];
glob_length = length;
qsort(str_matr,length,sizeof(unsigned char*),strCmpEnc);
out_str[length] = '\0';
for(i=0;i<(unsigned int) length;i++){
prnt_rt_str1 = printRotStr(length,&str[0],str_matr[i]);
prnt_rt_str2 = printRotStr(length,&prnt_rt_str1[0],&prnt_rt_str1[length-1]);
if(memcmp(str,prnt_rt_str2,length) == 0){
out_rownum = i;
}
out_str[i] = prnt_rt_str1[length-1];
}
printf("(%d ",out_rownum);
fwrite((unsigned char*) out_str, 1, length, stdout);
printf(")\n");
free(prnt_rt_str1);
free(prnt_rt_str2);
free(str_matr);
free(out_str);
}
和从stdin接收数据的代码
void encode(unsigned short int num, unsigned int block_size){
long b_length,length;
unsigned char* buffer;
freopen(NULL, "rb", stdin);
buffer = (unsigned char*) calloc(block_size+1,sizeof(unsigned char));
length = fread((unsigned char*) buffer, 1, block_size, stdin);
if(length == 0){
// file empty
}else{
b_length = length;
printf("##B-W:%ld##\n",length);
while(length == b_length){
buffer[block_size] = '\0';
encodeBlock(buffer,length);
length = fread((unsigned char*) buffer, 1, block_size, stdin);
}
if(length != 0){
printf("##B-W:%ld##\n",length);
buffer[length] = '\0';
encodeBlock(buffer,length);
}
}
free(buffer);
}
当它卡住时,它通常会终止并且屏幕上会显示“已杀死”。 我正在研究linux OS。
使用valgrind的结果: 程序卡住了,我的整个系统都挂起了。我无法看到任何调试结果,因为我必须手动关闭我的系统。
更新: 阻塞读取(59kB之后)的原因是由于许多内存泄漏,堆上没有剩余空间。我解决了这个问题,最后阅读工作正常。
答案 0 :(得分:0)
当它卡住时,它通常会终止并且屏幕上会显示“已杀死”。
这意味着,很可能,它耗尽了内存限制并被内核杀死。
老老实实地使用valgrind。您的代码太难以阅读,因为人类无法指出致命的错误(非致命的,但仍然很烦人)。