好吧,这个问题确实是一个挑战!

背景

我正在从事一个基于算术的项目,涉及比正常数字更大的数字。我是新的,我将使用 4 GB 上限文件大小的最坏情况场景(我什至希望将其扩展到 5GB 上限,因为我以前见过大于 4 GB 的文件大小 - 特别是图像 *. iso文件)

一般问题

现在,我将应用计算的算法目前并不重要,但加载和处理如此大量的数据 - 数字 - 很重要。

  • System.IO.File.ReadAllBytes(String) 只能读取 2 GB 的文件数据上限,所以这是我的第一个问题 - 我将如何加载和/或配置以访问内存,这样的文件大小 - 两倍,如果不是更多?
  • 接下来,我正在编写自己的类来将“流”或字节数组视为一个大数字,并添加多个运算符方法来执行十六进制算术,直到我在线阅读 System.Numerics.BigInteger() 类 - 但因为没有 BigInteger.MaxValue 并且我一次最多只能加载 2 GB 的数据,我不知道 BigInteger 的潜力是什么 - 即使与我正在编写的名为 Number() 的对象(它确实具有我想要的最小潜力)相比也是如此。可用内存和性能也存在问题,虽然我不太关心速度,但我更关心的是成功地完成了这个实验过程。

  • 概括
  • 我应该如何加载 4-5 GB 的数据?
  • 加载后的数据应该如何存储和处理?坚持使用 BigInteger 还是完成我自己的 Number 类(class)?
  • 我应该如何在运行时处理如此大量的内存而不用完内存?我将像处理任何其他数字而不是字节数组一样处理 4-5 GB 的数据 - 执行诸如除法和乘法之类的算术。

  • PS 根据非披露协议(protocol),我不能透露太多关于这个项目的信息。 ;)

    对于那些希望从我的 Number 对象中看到一个用于每字节数组加法器 (C#) 的示例运算符的人:
    public static Number operator +(Number n1, Number n2)
    {
        // GB5_ARRAY is a cap constant for 5 GB - 5368709120L
        byte[] data = new byte[GB5_ARRAY];
        byte rem = 0x00, bA, bB, rm, dt;
        // Iterate through all bytes until the second to last
        // The last byte is the remainder if any
        // I tested this algorithm on smaller arrays provided by the `BitConverter` class,
        // then I made a few tweeks to satisfy the larger arrays and the Number object
        for (long iDx = 0; iDx <= GB5_ARRAY-1; iDx++)
        {
            // bData is a byte[] with GB5_ARRAY number of bytes
            // Perform a check - solves for unequal (or jagged) arrays
            if (iDx < GB5_ARRAY - 1) { bA = n1.bData[iDx]; bB = n2.bData[iDx]; } else { bA = 0x00; bB = 0x00; }
            Add(bA, bB, rem, out dt, out rm);
            // set data and prepare for the next interval
            rem = rm; data[iDx] = dt;
        }
        return new Number(data);
    }
    private static void Add(byte a, byte b, byte r, out byte result, out byte remainder)
    {
        int i = a + b + r;
        result = (byte)(i % 256); // find the byte amount through modulus arithmetic
        remainder = (byte)((i - result) / 256); // find remainder
    }
    

    最佳答案

    使用 FileStream : http://msdn.microsoft.com/en-us/library/system.io.filestream.aspx

    关于c# - 需要 4 GB 或 5 GB 数字的算法 - 可能吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12363976/

    10-12 18:36