我正在尝试计算20x20布尔矩阵的数百万(10 8 )的排列。我能够很快地计算它们。 之后我需要使用标准输出显示它或将其存储到文件中。 您是否认为有可能以4小时的方式管理这些数据?
答案 0 :(得分:4)
10 18 操作?让我们看看......你的PC可能并不比每秒10次 9 到10 10 指令更好。因此,您需要至少10 9 至10 10 秒来进行10次 18 操作,这是超过31年的时间。这够快吗?在31年的时间里,你的电脑是否还能存活并拥有不间断的电力?
答案 1 :(得分:2)
20x20布尔矩阵是400位= 50字节* 10 ^ 8个排列= 5 * 10 ^ 9字节= 5 GB。
使用3 GBit / s SATA驱动器,您的下限为
5 GB = 40 GBit / 3 GBit/s ~ 13.3 sec
在我5岁的电脑上,复制一个1.9 GB的文件大约需要82秒。这涉及读写1.9 GB。因此,写入10 ^ 8 400位值的二进制表示的上限大约为215秒。
编写ASCII表示将使用大约50 GB并且花费大约8-10倍的时间,大约2150秒。这将是一个超过35分钟。
总而言之,我认为应该可以在不到4个小时内写下这些数据。
<强>更新强>:
我没有5 GB主内存来容纳所有排列。因此,我多次写入相同的数据。用
调用它./a.out a.bin 100
写入大约4.7 GiB的数据,并在我的机器上花费114秒。
#include <fstream>
struct matrix {
unsigned char data[50];
void write(std::ostream &f) {
f.write(reinterpret_cast<char*>(data), sizeof(data));
}
};
static const unsigned long N = 1000000;
matrix permutations[N];
int main(int argc, char **argv)
{
// prevent sparse file
for (unsigned long j = 0; j < N; ++j)
permutations[j].data[j % 50] = 1;
std::ofstream f(argv[1]);
f.sync_with_stdio(false);
unsigned long m = std::stoi(argv[2]);
for (unsigned long i = 0; i < m; ++i) {
for (unsigned long j = 0; j < N; ++j)
permutations[j].write(f);
}
return 0;
}
使用ASCII表示看起来类似
struct matrix {
unsigned char data[50];
friend std::ostream &operator<<(std::ostream &f, const matrix &x) {
static int bits[] = { 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80 };
for (int i = 0; i < 50; ++i) {
for (int j = 0; j < 8; ++j)
f << (x.data[i] & bits[j] ? '1' : '0');
}
return f;
}
};
并在main
for for循环
for (unsigned long i = 0; i < m; ++i) {
for (unsigned long j = 0; j < N; ++j)
f << permutations[j] << '\n';
}
在磁盘上写入大约3.8 GiB的10 ^ 7个排列,大约需要4:41分钟。写十倍这可能需要一个小时或90分钟。在当前的硬件上,这应该更快。
答案 2 :(得分:1)
对于10 ^ 8个排列,每个排列成50个字节(400位),它将提供大约5 GB的数据。应该可以将它存储在磁盘上的文件中,在普通磁盘上每秒100 MB,这样就可以为5 GB的数据提供50秒的总写入时间。
因此,如果您可以足够快地生成排列,那么在指定的4小时内将它们存储到文件中应该没有问题。