0

您好我有以下情况:

对于地图中的每个键值对,我都有一个std::map表单。<std::string, std::vector<uint8_t>>我需要确定磁盘上是否已经存在名称为 的文件,key否则我需要将value磁盘上的文件存储在名称为key. 现在我要做的是:

std::vector<std::string> bases_to_stor(std::map<std::string,
                                                std::vector<uint8_t>>& input)
{
    std::vector<std::string> hashes; 

    for (std::map<std::string, std::vector<uint8_t>>::iterator it = input.begin(); it != input.end(); ++it)
    {
        if (!std::filesystem::exists(it->first))
        {
            bool hash_in_hashes = false;
            for (const auto elm : hashes)
            {
                if (elm == it->first)
                {
                    hash_hashes = true;
                    break;
                }
            }
            if (!hash_in_hashes)
            {
                hashes.push_back(it->first); 
            }
        }
    }
    return hashes; 
}

但是大小input可能非常大,+10k 个条目,因此我想exists在多个线程中进行调用。但这有好处吗?存在调用可以并行完成吗?我一直无法在 C++ 标准中找到有关这方面的信息,也无法确定底层文件系统 EXT4 和 ZFS 是否支持,因此我需要对此有所启发。

4

1 回答 1

4

exists并行进行多个调用没有问题。操作系统当然支持它(毕竟它是一个多用户操作系统)并且 C++ 标准没有将它定义为竞争条件。(存在与对文件的交错 R/W 访问相关的潜在竞争条件,但exists它是只读的。)

不过,它是否会给你带来很大的加速,这是一个折腾。流水线 IO 是一种常见的优化,但它对独立的延迟绑定资源(如网络套接字)最有意义。如果所有请求都发送到同一个磁盘,您可能很快就会使带宽饱和。(尽管正如 Moeren 提到的,如果你有一个 UI 来保持响应,那么让这些调用远离主线程是一个好主意。)

当然,如果磁盘上潜在相关文件的数量小于您要查找的文件数量,最好枚举这些文件并根据地图检查每个文件,而不是相反。

于 2019-08-08T08:50:41.863 回答