gpt4 book ai didi

c# - 需要 4 GB 或 5 GB 数字的算法 - 这可能吗?

转载 作者:太空狗 更新时间:2023-10-30 00:26:13 30 4
gpt4 key购买 nike

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

背景

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

一般问题

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

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

总结

  • 我应该如何加载 4-5 GB 的数据?
  • 加载后的数据应该如何存储和处理?坚持 BigInteger或完成我自己的 Number上课?
  • 我应该如何在运行时处理如此大量的内存而不用完内存?我将像处理任何其他数字而不是字节数组一样处理 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
}

最佳答案

通常,您会使用流式 API 处理大文件,可以是原始二进制文件 (Stream),也可以是通过一些协议(protocol)读取器(XmlReaderStreamReader 等)。在某些情况下,这也可以通过内存映射文件来完成。这里的关键点是您一次只查看文件的一小部分(中等大小的数据缓冲区、逻辑“行”或“节点”等 - 取决于场景)。

奇怪的地方在于您希望以某种方式将其直接映射到某种形式的大数。坦率地说,如果没有更多信息,我不知道我们如何能提供帮助,但是如果您正在处理这种大小的实际数字,我认为除非二进制协议(protocol)使那个方便。而“进行除法和乘法等运算”对原始数据没有意义;这仅对定义了自定义操作的解析数据有意义。

另请注意,在 .NET 4.5 中,您可以翻转配置开关以扩展数组的最大大小,超过 2GB 的限制。它仍然有一个限制,但是:它有点大。不幸的是,元素 的最大数量仍然相同,因此如果您使用的是 byte[] 数组,它就无济于事了。但是,如果您使用 SomeCompositeStruct[],您应该能够获得更高的使用率。参见 gcAllowVeryLargeObjects

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

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com