Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我的结构数组在C#中内存不足,如何修复?_C#_.net_Memory_Data Structures_Collections - Fatal编程技术网

我的结构数组在C#中内存不足,如何修复?

我的结构数组在C#中内存不足,如何修复?,c#,.net,memory,data-structures,collections,C#,.net,Memory,Data Structures,Collections,您好,我必须将这个结构的所有元素存储在内存中进行处理,我不能一次只加载一块,我必须在任何时候加载所有元素,因此我试图将其全部装入内存,但不知怎的,内存耗尽了,尽管我有大约20GB的RAM,可能还有17GB。。我知道碰撞有2GB的内部限制,所以RAM在这个意义上根本不重要 下面是我的布局 public struct REGTYPE { public byte REG_Kind; // ;1=8 bits \ 2=16 bits \ 3=32 bits \ 4=MMX \ 5=XMM \ 6

您好,我必须将这个结构的所有元素存储在内存中进行处理,我不能一次只加载一块,我必须在任何时候加载所有元素,因此我试图将其全部装入内存,但不知怎的,内存耗尽了,尽管我有大约20GB的RAM,可能还有17GB。。我知道碰撞有2GB的内部限制,所以RAM在这个意义上根本不重要

下面是我的布局

public struct REGTYPE
{
    public byte REG_Kind; // ;1=8 bits \ 2=16 bits \ 3=32 bits \ 4=MMX \ 5=XMM \ 6=Float stack \ 7=Segment \ 8=Debug \ 9=Control \ 10=Test
    public byte REG_Ptr_Kind; // ;1=Byte PTR \ 2=Word PTR \ 3=Dword PTR \ 4=Qword PTR \ 5=mmword ptr \ 6=xmmword ptr \ 7=FWord PTR \ 8=tbyte ptr \ 9=null ptr (LEA)
    public byte REG_Type; //  ;0-7= direct register index \ 16 register=byte && 7 \ 32 register=(byte && 63)/8 \ 64=[32/16 address only] \ 128=[using x86 relatives]
    public byte REG_BaseAsReg; // ? ;1=Register only (BASE exposed)!
}

public struct REGSTRUCT
{
    public uint SEG_TYPE;
    public uint Base;
    public uint INDEX;
    public uint SCALE;
    public uint DISPLACEMENTS;
    public uint DISPLACEMENT_TYPE;
    public REGTYPE REG_Kind;
    public uint PTR_TYPE;
}

public struct IMMSTRUCT
{
    public uint VALUE_LO;
    public uint VALUE_HI;
    public uint VALUE_TYPE; //     1=Byte \ 2=Word \ 4=Dword \ 8=ByteToWord \ 16=ByteToDword \ 32=AbsJump \ 64=ShortJump \ 128=LongJump
}


public struct DisAsmStruct
{
    public uint Instruction_Prefix;
    public uint Instruction;
    public REGSTRUCT Reg1;
    public REGSTRUCT Reg2;
    public uint Reg_Reg; //1=from ptr
    public IMMSTRUCT Imm;
    public uint Instruction_Length;
}

public struct AsmStruct
{
    public uint Address;
    public string ASM;
    public DisAsmStruct disASM; //tried to add ref keyword no success
}

public static AsmStruct[] AsmCache = null;

在运行这个代码的过程中,它在<代码>数组上崩溃。Resiths< /Cord>行表示当AsCask达到大约200万个元素时它已经内存不足,在加载之前必须达到10个或2000万个元素,我知道在结构中打包所有这些都不会像C++那样耗尽内存。我还相信我知道这个问题的原因,原因是它将结构存储为自身的副本,而不仅仅是对该结构的引用,因此每个结构浪费的内存是原来的两倍。如何在AsmCache中通过引用存储结构?我之所以使用

Array.Resize
,是为了在每次找到更多指令时将收集限制增加1000。。我不只是设定一些任意的限制。这是我在Vb6(ReDim Preserve)中使用的方法


如果要允许大于2GB的对象,则需要允许它们。 下面将进入app.config文件或其他配置文件,具体取决于您的项目类型

<configuration>
    <runtime>
        <gcAllowVeryLargeObjects enabled="true" />
    </runtime>
</configuration>

文档


如果要允许大于2GB的对象,则需要允许它们。 下面将进入app.config文件或其他配置文件,具体取决于您的项目类型

<configuration>
    <runtime>
        <gcAllowVeryLargeObjects enabled="true" />
    </runtime>
</configuration>

文档


AsmStruct
设为类,否则当您调整数组大小(或
列表本身大小)时,您会将所有数据复制到新位置(顺便说一句,这非常慢)。使用
AsmStruct
作为类,您只复制指针。我模拟了您的调整大小策略,使用该类,您可以在OutOfMemory之前创建4倍以上的项目

使用editbin技巧,您可以将限制推到2倍以上


如果这还不够,并且您只有32位库,那么您必须以某种方式拆分程序。一个32位程序用于与库通信,一个64位程序用于处理。

AsmStruct
设为类,否则当您调整数组大小(或
列表自身大小)时,您会将所有数据复制到新位置(顺便说一句,速度非常慢)。使用
AsmStruct
作为类,您只复制指针。我模拟了您的调整大小策略,使用该类,您可以在OutOfMemory之前创建4倍以上的项目

使用editbin技巧,您可以将限制推到2倍以上


如果这还不够,并且您只有32位库,那么您必须以某种方式拆分程序。一个32位程序用于与库通信,一个64位程序用于处理。

在运行此代码的过程中,它崩溃了
我没有看到任何代码。只是定义……您可以将代码编译为x64,并获得更大的虚拟地址空间。这允许您使用超过2G的RAM。我将至少将其中一些结构更改为类,这样您就可以避免创建重复的结构。@Eser我将使用代码张贴在问题的底部,对此表示抱歉,但我只是认为现在将字符串设置为.ASM是一种自我解释,将结构设置为disASM,一个无符号整数来寻址,经过几百万次迭代后,我得到一个OutOfMemory崩溃
,在运行这段代码的过程中它崩溃了
,我没有看到任何代码。只是定义……您可以将代码编译为x64,并获得更大的虚拟地址空间。这允许您使用超过2G的RAM。我将至少将其中一些结构更改为类,这样您就可以避免创建重复的结构。@Eser我将使用代码张贴在问题的底部,对此表示抱歉,但我只是认为现在将字符串设置为.ASM是一种自我解释,将结构设置为disASM,还有一个无符号整数要寻址,经过几百万次迭代后,我得到了一个OutOfMemory崩溃。这可能是答案了,多亏了bunch mate,嘿,你知道如何在Visual Studio 2015 IDE中激活这个键/值吗?尽管我阅读了文档,但我发现只有打开app.config文件,才能将该标记添加到中。只需确保它嵌套在正确的标记中。Ye,看起来它做到了,但相同的错误发生在1720000个元素上<代码>在mscorlib.dll中发生“System.OutOfMemoryException”类型的未处理异常
。我会尝试将它从任何CPU更改为x64或类似的东西。无法使用x64模式dammit不会加载32位DLL<代码>其他信息:无法加载DLL“disASM.DLL”:找不到指定的模块。(HRESULT:0x8007007E的例外)
是否尝试在“AnyCPU”模式下取消选中项目属性中的“首选32位”标志?disASM.dll是一个x64兼容库吗?哇,这可能是答案了,谢谢一个朋友,嘿,你知道如何在Visual Studio 2015 IDE中激活这个键/值吗?尽管我阅读了文档,但我发现只有打开app.config文件,才能将该标记添加到中。只需确保它嵌套在正确的标记中。Ye,看起来它做到了,但相同的错误发生在1720000个元素上<代码>在mscorlib.dll中发生“System.OutOfMemoryException”类型的未处理异常。我会尝试将它从任何CPU更改为x64或类似的东西。无法使用x64模式dammit不会加载32位DLL<代码>其他信息:无法加载DLL“disASM.DLL”:找不到指定的模块。(HRESULT:0x8007007E的例外)是否尝试在“AnyCPU”模式下取消选中项目属性中的“首选32位”标志?是disASM.dll