gpt4 book ai didi

c++ - 多线程 std::filesystem::exists 调用有意义吗?

转载 作者:行者123 更新时间:2023-11-27 22:33:51 24 4
gpt4 key购买 nike

您好,我有以下场景:

我有一个 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 是否支持它,因此我需要一些启发。

最佳答案

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

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

当然,如果磁盘上可能相关的文件数量少于您要查找的文件数量,最好枚举这些文件并对照 map 检查每个文件,而不是相反。

关于c++ - 多线程 std::filesystem::exists 调用有意义吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57408427/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com