针对极大数据的无损数据压缩 - 行星人工智能

时间:2012-07-06 09:48:18

标签: lossless-compression large-data

我想创造一个具有行星大小的人工智能环境。它将模拟一个非常大的世界的地下生活。根据维基百科,地球的表面积为510,072,000 Km ^ 2,我想创建一个相似比例的方块,可能更大。我会在每个位上存储一米,其中0表示污垢,1表示污垢墙。

让我们首先计算如何存储这个方块的单行。一行是510072000000m,每个字节可以存储8米,所以一行是59.38GB,整个世界是3.44PB。而且我想在每平方米上添加至少水和熔岩,这会使结果乘以2.

我需要使用无损数据压缩算法压缩此信息。我首先用7zip尝试了一种非常直接的方法,我尝试了一个较小的世界,其中一行是6375B。理论上,世界应该是6375 ^ 2B = 38.76MB,但是当我尝试它时我得到一个155MB的文件,我不知道为什么会出现这种差异。但是当我用7Zip压缩它时,我得到一个40.1MB的文件。这是一个巨大的差异,我将3.44PB世界文件转换为912.21GB文件。

我的第一个想法是,为什么我有这么大的文件,当数学告诉我它应该更小?也许问题是代码,也许问题是我在数学上有错误。代码如下:(C#)

// 510072000000m each line = 63759000000B
const long SIZE = 6375;

// Create the new, empty data file.
string fileName = tbFile.Text;

FileStream fs = new FileStream(fileName, FileMode.Create);

// Create the writer for data.
BinaryWriter w = new BinaryWriter(fs);

// Use random numbers to fill the data
Random random = new Random();
// Write data to the file.
for (int i = 0; i < SIZE; i++)
{
    for (int j = 0; j < SIZE; j++)
    {
        w.Write(random.Next(0,256));
    }
}

w.Close();

fs.Close();

数学是如此基本,如果我做错了什么我就看不到它。

你可以给我任何建议吗?只关注数据压缩,人工智能不是问题,因为我有进化算法的经验,世界不需要是实时的,它可能需要它所需的所有时间。

谢谢大家的时间。

2 个答案:

答案 0 :(得分:3)

我不知道C#,但似乎你每次写4个字节(6375 * 6375 * 4字节,MB = 155 MB)。所以我猜Write方法当前写的是32位整数。

答案 1 :(得分:2)

@Scharron已经正确回答了你问题的具体细节,但我认为还有一个更基本的问题:

理论上不可能显着压缩随机数据。实际上,当给定随机输入数据时,大多数压缩算法将增加存储大小。也许你的AI算法的细节会引入一些模式而不是压缩,但如果你从真正的随机输入数据开始,你将不得不存储那些多个PB。

您看到显着压缩的原因是,正如@Scharron指出的那样,您为每个数据字节写了3个零字节,从而导致更容易压缩的数据。