写入数据时随机发生的分段错误

时间:2019-06-13 08:51:09

标签: c++

我有以下情况,我将文件大小为 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。因此,我有可能与文件描述符或索引节点有关?

1 个答案:

答案 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,则代码将起作用,但会导致性能下降。