我有大量的数据集合,这些数据在内存中读取并用于进行许多计算。我有很多目录,每个目录包含许多txt文件。 对于一个目录,我从txt文件中读取数据并将结果放入向量(无符号long long)的向量(V)中,其中每个向量对应一个文件(从同一目录中读取文件以并行方式完成) 。每个文件包含大约100万行,其中每行包含大约15,000个无符号长long元素。 在此函数之后,我创建了一个unordered_map,其中包含所有先前向量的向量(V)被添加为映射的键,如果元素存在两次,则其值递增。 (我们需要合并来自同一目录的数据) 为了将所有数据存储在内存中,我创建了一个unordered_map的向量,其中每个映射包含来自一个目录的元素。
std::vector<std::unordered_map<unsigned long long, unsigned short> > vect_maps(nb_directories);
for(i=0;i<nb_directories;i++){
read_directory(direct[i],txt_files);
size_t n_file = txt_files.size();
size_t j;
std::vector<std::vector<unsigned long long> > v(n_file);
omp_set_dynamic(0)
omp_set_num_threads(n_thread);
#pragma omp parallel for num_threads(n_thread) shared(direct,txt_files)
for(j=0;j<n_file;j++){
std::string path=direct[i]+"/"+txt_files[j];
One_file o(path, v[j]);
}
std::unordered_map<unsigned long long, unsigned short>::iterator it;
vect_maps[i].clear();
for(j=0;j<n_chunk;j++){
size_t s=v[j].size();
for(size_t p = 0;p<s;p++){
it = vect_maps[i].find(v[j][p]);
if (it != vect_maps.end()) {
it->second++;
}
else {
vect_maps[i][v[j][p]] = 1;
}
}
到此为止,算法需要很长时间才能获得大量内存。
我需要从现有密钥创建新密钥以减少现有密钥的值(位数)。新密钥将非稀疏且值较小。
std::unordered_map<unsigned long long,std::vector<unsigned short> > all_maps;
all_maps.clear();
for (i = 0;i <nb_directories;i++) {
for (auto it = vect_maps[i].begin(); it != vect_maps[i].end(); ++it) {
if(all_maps.find(it->first) != all_maps.end())
all_maps[it->first][i] += 1;
else{
std::vector<unsigned short> value_vector= std::vector<unsigned short>(nb_directories,0);
value_vector[i]=1;
all_maps[it->first] = value_vector;
}
}
}
std::unordered_map<unsigned long long, unsigned long long> map_link;
for (auto it = all_maps.begin(); it != all_maps.end(); ++it){
map_link[it->first] = i;
i++;
}
我的问题是这种实现方式(vector + unordered_map)是最好的,关于时间和内存消耗?