好吧,这个问题确实是一个挑战!
背景
我正在从事一个基于算术的项目,涉及比正常数字更大的数字。我是新的,我将使用 4 GB 上限文件大小的最坏情况场景(我什至希望将其扩展到 5GB 上限,因为我以前见过大于 4 GB 的文件大小 - 特别是图像 *. iso文件)
一般问题
现在,我将应用计算的算法目前并不重要,但加载和处理如此大量的数据 - 数字 - 很重要。
System.IO.File.ReadAllBytes(String)
只能读取 2 GB 的文件数据上限,所以这是我的第一个问题 - 我将如何加载和/或配置以访问内存,这样的文件大小 - 两倍,如果不是更多? System.Numerics.BigInteger()
类 - 但因为没有 BigInteger.MaxValue
并且我一次最多只能加载 2 GB 的数据,我不知道 BigInteger
的潜力是什么 - 即使与我正在编写的名为 Number()
的对象(它确实具有我想要的最小潜力)相比也是如此。可用内存和性能也存在问题,虽然我不太关心速度,但我更关心的是成功地完成了这个实验过程。 概括
BigInteger
还是完成我自己的 Number
类(class)? 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/