将大量 UTF8 字节写入文件会导致大量膨胀
Writing a large amount of UTF8 bytes to a file results in massive bloat
所以我最近在玩,并试图生成一个 1GB 的文件。
StreamWriter writer = new StreamWriter(@"C:\Users\parsonsj\Desktop\data.dat");
Encoding utf8enc = UTF8Encoding.UTF8;
for (int i = 0; i < 1073741824; i++) {
writer.Write(utf8enc.GetBytes("#"));
}
writer.Close();
我的想法是,由于 UTF8 字符是 1 个字节,而 1GB 大约是 1,073,741,824 字节,因此写入单个 UTF8 字符 1,073,741,824 次将导致大约 1GB 的文件大小。
我 运行 我的小程序,正如预期的那样,它开始减慢速度并占用内存。我最终过早地杀死了它,然后去检查文件大小,好奇我能走多远。令我震惊的是,该文件是一个惊人的 13GB.
我不知道它是怎么变得这么大的。也许我编码错误。也许存在某种疯狂的内存泄漏相关错误。我只是很困惑。
为什么我的文件这么大?我误解了编码或数学吗?
这是因为 writer.Write
没有 byte[]
数组的重载。编译器认为您正在尝试调用采用 System.Object
的重载,因此数组将作为 "System.Byte[]"
.
写入流
使用 FileStream
的 Write(Byte\[\], int, int)
方法解决此问题。
所以我最近在玩,并试图生成一个 1GB 的文件。
StreamWriter writer = new StreamWriter(@"C:\Users\parsonsj\Desktop\data.dat");
Encoding utf8enc = UTF8Encoding.UTF8;
for (int i = 0; i < 1073741824; i++) {
writer.Write(utf8enc.GetBytes("#"));
}
writer.Close();
我的想法是,由于 UTF8 字符是 1 个字节,而 1GB 大约是 1,073,741,824 字节,因此写入单个 UTF8 字符 1,073,741,824 次将导致大约 1GB 的文件大小。
我 运行 我的小程序,正如预期的那样,它开始减慢速度并占用内存。我最终过早地杀死了它,然后去检查文件大小,好奇我能走多远。令我震惊的是,该文件是一个惊人的 13GB.
我不知道它是怎么变得这么大的。也许我编码错误。也许存在某种疯狂的内存泄漏相关错误。我只是很困惑。
为什么我的文件这么大?我误解了编码或数学吗?
这是因为 writer.Write
没有 byte[]
数组的重载。编译器认为您正在尝试调用采用 System.Object
的重载,因此数组将作为 "System.Byte[]"
.
使用 FileStream
的 Write(Byte\[\], int, int)
方法解决此问题。