将一个非常大的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快速写入.txt文件

这是一个非常愚蠢的问题,没有实际用途。但是,确切地知道处理器周期被使用在哪里总是很重要的。你抱怨写入文件的时间太长。那么,你确定是实际上文件慢吗?还是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);
         }
    }