Я бы реализовал класс-оболочку, который использует несколько внутренних массивов.
Аналогично следующему:
void Main()
{
long count=3*1024*1024;
var arr=new LargeArray<Complex>(count,12);
for(long i=0;i<count;i++)
{
arr[i]=new Complex(i,-i);
}
for(long i=0;i<count;i++)
{
if(arr[i].R!=i)
throw new Exception("Fail"+i+" "+arr[i].R);
}
}
struct Complex
{
public double R,I;
public Complex(double r,double i)
{
R=r;
I=i;
}
}
class LargeArray<T>
{
private readonly int partBits;
private readonly long size;
private T[][] data;
public T this[long index]
{
get
{
if((ulong)index>=(ulong)size)
throw new IndexOutOfRangeException();
int part=(int)(index>>partBits);
int subIndex=(int)(index&((1<<partBits)-1));
return data[part][subIndex];
}
set
{
if((ulong)index>=(ulong)size)
throw new ArgumentOutOfRangeException();
int part=(int)(index>>partBits);
int subIndex=((int)index&((1<<partBits)-1));
data[part][subIndex]=value;
}
}
public LargeArray(long size,int partBits)
{
this.size=size;
this.partBits=partBits;
int partSize=1<<partBits;
int partCount=(int)(((size-1)>>partBits)+1);
data=new T[partCount][];
for(int i=0;i<partCount;i++)
data[i]=new T[partSize];
}
}
Если вы используете 64-битный процесс, это работает за пределами 2 ГБ.Я попробовал его с 5 ГБ, и, кроме того, что мой комп остановился, он работал.