如何在C ++中处理大量数据

时间:2017-11-28 10:44:13

标签: c++ vector bigdata unordered-map

我有大量的数据集合,这些数据在内存中读取并用于进行许多计算。我有很多目录,每个目录包含许多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)是最好的,关于时间和内存消耗?

0 个答案:

没有答案