这就是我想出的。下面的代码创建了一个 int[1000][10000] 并使用 BinaryFormatter 将其写入 2 个文件 - 一个已压缩,一个未压缩。
压缩文件为 1.19 MB(1,255,339 字节),解压缩后为 38.2 MB(40,150,034 字节)
int width = 1000;
int height = 10000;
List<int[]> list = new List<int[]>();
for (int i = 0; i < height; i++)
{
list.Add(Enumerable.Range(0, width).ToArray());
}
int[][] bazillionInts = list.ToArray();
using (FileStream fsZ = new FileStream("c:\\temp_zipped.txt", FileMode.Create))
using (FileStream fs = new FileStream("c:\\temp_notZipped.txt", FileMode.Create))
using (GZipStream gz = new GZipStream(fsZ, CompressionMode.Compress))
{
BinaryFormatter f = new BinaryFormatter();
f.Serialize(gz, bazillionInts);
f.Serialize(fs, bazillionInts);
}
我想不出更好/更简单的方法来做到这一点。带拉链的版本非常紧。
我会选择 BinaryFormatter + GZipStream。做一些定制的东西一点也不好玩。
[MG 编辑] 我希望您不会被编辑冒犯,但统一重复的 Range(0,width) 会极大地扭曲事物;改成:
int width = 1000;
int height = 10000;
Random rand = new Random(123456);
int[,] bazillionInts = new int[width, height];
for(int i = 0 ; i < width;i++)
for (int j = 0; j < height; j++)
{
bazillionInts[i, j] = rand.Next(50000);
}
试试看;你会看到temp_notZipped.txt
40MBtemp_zipped.txt
和 62MB。没那么吸引人...