处理数百万个排列

时间:2013-03-25 23:49:29

标签: c++ c performance

我正在尝试计算20x20布尔矩阵的数百万(10 8 )的排列。我能够很快地计算它们。 之后我需要使用标准输出显示它或将其存储到文件中。 您是否认为有可能以4小时的方式管理这些数据?

3 个答案:

答案 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小时内将它们存储到文件中应该没有问题。