我有以下情况,我将文件大小为 n 的文件分成一组较小的块 C ,其中每个 c 在 C 的大小为 k ,我需要将所有 c 存储在磁盘上。每个 c 都表示为std::vector<uint8_t>
,并在写入文件时使用和标识符,标识符是 c 的SHA-1表示为std::string
。我使用此功能将 c 写入磁盘:
bool vector_disk_writer(const std::string path, const std::vector<uint8_t>& data)
{
const uint8_t* cdata = data.data();
FILE* fp; // File pointer
if((fp=fopen(path.c_str(), "wb"))==NULL) {
printf("Cannot open file.\n");
return false;
}
bool result = true;
if (fwrite(cdata, sizeof(uint8_t), data.size(), fp) != data.size())
{
result = false;
}
fclose(fp);
return result;
}
我对多个文件执行此操作,但要确定 c 是否已准备好存储在磁盘上,如果我不调用上述函数。因此本质上是避免数据重复。
现在我的问题是,如果我有 k = 4kB,那么在写了大约850万个文件之后,我开始看到分段错误,而当 k = 1kB时,我会看到它1650万档案。
当我调用vector_disk_writer
函数时发生分段错误,但不确定为什么。我本来以为是由于许多打开的文件描述符造成的,但是该应用程序不是并行运行的,因此我还没有返回false
的功能。
我使用了带有以下参数--tool=memcheck --leak-check=yes
的valgrind,该参数不返回错误。
那么有什么想法可能导致分段错误吗?
编辑:
更新代码示例,其次,我在其他服务器上运行了它,并在将函数更新到上面的内容之后,它实际上显示了错误:Cannot open file
。因此,我有可能与文件描述符或索引节点有关?
答案 0 :(得分:0)
经过很多时间,除了上面的注释中提到的问题之外,我的代码还发现了问题,我得出的结论是,实际上不是我的代码是问题所在。
将上面的写入功能修改为以下内容之后:
bool vector_disk_writer(const std::string path, const std::vector<uint8_t>& data)
{
const uint8_t* cdata = data.data();
FILE* fp; // File pointer
if((fp=fopen(path.c_str(), "wb"))==NULL) {
perror(path.c_str());
return false;
}
bool result = true;
if (fwrite(cdata, sizeof(uint8_t), data.size(), fp) != data.size())
{
result = false;
}
fclose(fp);
return result;
}
我仍然遇到分割错误,但很少见,但据我所知,perror
总是被调用。即使根据df
,我只用了大约25%的空间,但错误不再是设备上剩余的空间。现在,我的一个朋友想起了EXT文件系统中称为dir_index
的功能,该功能可以使用哈希表更快地索引目录。这很酷,除了每个目录的表都有上限(我无法找到)的事实。如果禁用dir_index
,则代码将起作用,但会导致性能下降。