将一个非常大的BigInteger快速写入.txt文件
本文关键字:BigInteger 文件 txt 非常 一个 | 更新日期: 2023-09-27 18:19:35
我需要一种更快的方法来将160万位数的BigInteger输出到文件中。我现在正在使用此代码。
FileStream fs1 = new FileStream("C:''Output''Final''BigInteger.txt", FileMode.OpenOrCreate, FileAccess.Write);
StreamWriter writer = new StreamWriter(fs1);
writer.WriteLine(big);
writer.Close();
这大约需要5分钟才能输出160万个数字。有什么办法加快速度吗?
这是一个非常愚蠢的问题,没有实际用途。但是,确切地知道处理器周期被使用在哪里总是很重要的。你抱怨写入文件的时间太长。那么,你确定是实际上文件慢吗?还是BigInteger.ToString()比较慢?
找出问题的最好方法就是写文件,这样你就可以隔离问题:
using System;
using System.Text;
using System.IO;
class Program {
static void Main(string[] args) {
var big = new StringBuilder(1600 * 1000);
big.Append('0', big.Capacity);
var sw = System.Diagnostics.Stopwatch.StartNew();
// Your code here
FileStream fs1 = new FileStream("BigInteger.txt", FileMode.OpenOrCreate, FileAccess.Write);
StreamWriter writer = new StreamWriter(fs1);
writer.WriteLine(big);
writer.Close();
// End of your code
sw.Stop();
Console.WriteLine("That took {0} milliseconds", sw.ElapsedMilliseconds);
Console.ReadLine();
}
}
我机器上的输出:
That took 13 milliseconds
写入文件非常快,文件系统缓存使其成为内存到内存的副本。在程序停止运行很久之后,操作系统就会懒散地将其写入磁盘。当您写入的数据超过缓存容量时,它永远无法隐藏缓慢的磁盘写入速度。你在任何现代机器上都无法接近,它们有很多RAM,可以轻松存储千兆字节。1.6兆字节是牙线。
所以你知道实际上是BigInteger.ToString()太慢了。是的。它把"大妈妈"存储在基数2中,使数学运算尽可能快。像base 2这样的处理器,它们用两个手指计数。转换成人类格式,基本为10,这很昂贵。它需要划分,这是处理器所能做的最昂贵的事情之一。
您可以尝试将数字转换为字符串,拆分为几个部分并逐部分编写:
using (StreamWriter outfile = new StreamWriter("C:''Output''Final''BigInteger.txt"))
{
foreach var part in numberParts
{
outfile.Write(part);
}
}