我有一个巨大的vector<vector<bool>>
(512x 44,000,000位)。我需要4-5个小时来进行计算才能创建它,显然我想保存结果以免我再次重复这个过程。当我再次运行程序时,我想要做的就是加载相同的向量(没有其他应用程序将使用此文件)。
我认为文本文件不是那么大的问题。有这么简单(快速和肮脏)的方法吗?我不使用Boost,这只是我的科学应用程序的一小部分,所以它必须是快速的东西。我还想过在线反转并将其存储在Postgres数据库中(44000000条记录,512位数据),因此数据库可以轻松处理。我看过这样的答案需要8比特&gt; 1byte然后保存,但由于我有限的新手C ++经验,他们听起来太复杂了。有什么想法吗?
答案 0 :(得分:3)
您可以将 8位保存到一个字节中:
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位:
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,在cpu上花费4-5个小时的令人尴尬的并行算法可以在gpu上缩短到0.04 - 0.05小时(或者甚至不到一分钟的多个gpus)例如,上层“保护/装载机”功能令人尴尬地平行。
答案 1 :(得分:2)
我看过这样的答案需要8比特&gt; 1byte然后保存,但由于我有限的新手C ++经验,他们听起来太复杂了。有什么想法吗?
如果您要经常阅读该文件,这将是学习按位操作的好时机。每个布尔使用一位将是大小的1/8。这将节省大量内存和I / O.
因此,将其保存为每个bool一位,然后将其分解为块和/或使用映射内存(例如mmap
)读取它。您可以将它放在一个可用的接口后面,因此您只需要实现一次并在需要读取值时抽象出序列化格式。
答案 2 :(得分:1)
如前所述的过程,这里vec是bool向量的向量,我们将所有位包装在子向量8 x 8(以字节为单位)中并将这些字节推送到向量中。
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);