首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++保存和加载巨大的vector<bool>

C++保存和加载巨大的vector<bool>
EN

Stack Overflow用户
提问于 2013-07-13 23:12:04
回答 3查看 2K关注 0票数 2

我有一个很大的vector<vector<bool>> (512x44000000位)。这需要我花4-5个小时来计算创建它,显然我想保存结果,以避免我再次重复这个过程。当我再次运行程序时,我想要做的就是加载相同的向量(其他应用程序都不会使用这个文件)。

我相信文本文件对于这么大的尺寸是不可能的。有没有一种简单的(快速和肮脏的)方法来做到这一点?我不使用Boost,这只是我的科学应用程序中的一小部分,所以它必须是快速的。我还想把它放到一个Postgres DB中(44000000条记录,512位数据),这样DB就可以很容易地处理它。我见过这样的答案,取8位>1字节,然后保存,但以我有限的新手C++经验,它们听起来太复杂了。有什么想法吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-07-13 23:50:57

过程如前所述,这里vec是bool向量的向量,我们将子向量8x8中的所有位打包成字节,并将这些a字节放入向量中。

代码语言:javascript
复制
 std::vector<unsigned char> buf;
 int cmp = 0;
 unsigned char output=0;
   FILE* of = fopen("out.bin")
  for_each ( auto& subvec in vec)
  {
       for_each ( auto b in subvec)
       {
            output=output | ((b ? 1 : 0) << cmp);
             cmp++;
            if(cmp==8)
             {
                 buf.push_back(output);
                 cmp = 0;
                 output = 0;
              }
          }
            fwrite(&buf[0], 1, buf.size(), of);
            buf.clear();
       }

         fclose(of);
票数 1
EN

Stack Overflow用户

发布于 2013-07-13 23:32:47

您可以将8位保存到单个字节中:

代码语言:javascript
复制
unsigned char saver(bool bits[])
{
   unsigned char output=0;
   for(int i=0;i<8;i++)
   {

           output=output|(bits[i]<<i); //probably faster than if(){output|=(1<<i);}
           //example: for the starting array 00000000
           //first iteration sets:           00000001 only if bits[0] is true
           //second sets:                    0000001x only if bits[1] is true
           //third sets:                     000001xx only third is true
           //fifth:                          00000xxx if fifth is false
           // x is the value before

   }
   return output;
}

您可以从单个字节加载8位:

代码语言:javascript
复制
void loader(unsigned char var, bool * bits)
{

   for(int i=0;i<8;i++)
   {

       bits[i] = var & (1 << i);
       // for example you loaded var as "200" which is 11001000 in binary
       // 11001000 --> zeroth iteration gets false
       // first gets false
       // second false
       // third gets true 
       //...
   }

}

1<<0 is 1  -----> 00000001
1<<1 is 2  -----> 00000010
1<<2 is 4  -----> 00000100
1<<3 is 8  -----> 00001000
1<<4 is 16  ----> 00010000
1<<5 is 32  ----> 00100000
1<<6 is 64  ----> 01000000
1<<7 is 128  ---> 10000000

编辑:使用gpgpu,一个在gpu上花费4-5小时的令人尴尬的并行算法可以在gpu上缩短到0.04 - 0.05小时(甚至在多个gpu的情况下不到一分钟)例如,上面的"saver/loader“函数并行得令人尴尬。

票数 3
EN

Stack Overflow用户

发布于 2013-07-13 23:26:14

我见过这样的答案,取8位>1字节,然后保存,但以我有限的新手C++经验,它们听起来太复杂了。有什么想法吗?

如果您要经常读取该文件,这将是学习按位操作的好时机。每个bool使用一个位将是大小的1/8。这将节省大量内存和I/O。

因此,将它保存为每个bool一位,然后将其分成块和/或使用映射内存(例如mmap)读取它。您可以将其放在一个可用的接口后面,因此您只需实现它一次,并在需要读取值时抽象出序列化格式。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17631453

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档