C++ 处理数百万个排列

C++ 处理数百万个排列,c++,c,performance,C++,C,Performance,我试图计算一个20x20布尔矩阵的数百万(108)个置换。我能很快地计算它们。 之后,我需要使用标准输出来显示它,或者将其存储到文件中。 您认为是否有可能以某种方式在4小时内管理如此数量的数据 1018次手术?让我们看看。。。你的电脑每秒大概只能执行109到1010条指令。所以,你至少需要109到1010秒来做1018次手术,这是31年的时间。够快吗?您的电脑在31年的时间内是否仍能正常工作并保持不间断供电?20x20布尔矩阵是400位=50字节*10^8排列=5*10^9字节=5 GB 使用3

我试图计算一个20x20布尔矩阵的数百万(108)个置换。我能很快地计算它们。 之后,我需要使用标准输出来显示它,或者将其存储到文件中。
您认为是否有可能以某种方式在4小时内管理如此数量的数据

1018次手术?让我们看看。。。你的电脑每秒大概只能执行109到1010条指令。所以,你至少需要109到1010秒来做1018次手术,这是31年的时间。够快吗?您的电脑在31年的时间内是否仍能正常工作并保持不间断供电?

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.9GB的文件需要约82秒。这涉及到读写1.9GB。因此,编写10^8 400位值的二进制表示的上限约为215秒

编写一个ASCII表示将使用大约50GB,大约需要8-10倍的时间,大约2150秒。这将是35分钟多一点

总而言之,我认为应该可以在不到4小时内写出这么多的数据

更新

我没有5 GB的主内存来保存所有排列。因此,我多次写入相同的数据。打电话给

./a.out a.bin 100
在我的机器上写入大约4.7Gib的数据,耗时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;
}

写入10^7个排列在磁盘上使用了大约3.8 GiB,大约需要4:41分钟。写十次那么多可能需要一个小时或者90分钟。在当前的硬件上,这应该更快。

每10^8个排列压缩成50字节(400位),它将提供大约5 GB的数据。在普通磁盘上,应该可以以每秒100MB的速度将其存储到磁盘上的文件中,这样5GB数据的总写入时间为50秒


因此,如果您能够足够快地生成排列,那么在指定的4小时内将它们存储到文件中应该不会有问题。

将某些内容存储到文件中并显示供人使用是两件不同的事情。您是在试图保存生成的数据以供以后使用,还是根据其特征生成某种报告?我很困惑。你到底在问什么?@Paranoid42:你知道
10^18
是一个巨大的数字,对吗?如果您设法将一个排列存储为一个字节,则需要一百万个1TB硬盘驱动器。您想做什么?这是您的解决方案?我不理解这个问题。你说你可以“很快地计算它们”——所以你已经知道需要多长时间了?不过我想这是个错误。也许有几十亿。@perreal我看不出上下文中有什么不同。也许你是对的。嗨,谢谢,我试着像纯文本一样,但似乎它永远不会结束。你能在cpp中提供一个关于如何实现二进制数据性能的特定代码吗?@Paranoid42这只是对可能需要多长时间的估计。根据可用硬件的不同,这可能会更长。但在当前的机器上,它应该更快。
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;
    }
};
for (unsigned long i = 0; i < m; ++i) {
    for (unsigned long j = 0; j < N; ++j)
        f << permutations[j] << '\n';
}