Mar*_*ell 15
如果没有问题陈述,这有点难以回答,即您目前面临的问题,但以下只是一些想法,基于我们在类似场景中的一些近期经验.然而,要改变这种类型的模型需要付出很多努力 - 所以它还取决于您可以投入多少资金来"修复"它,而且我不能保证"您的问题"与"我们的问题"相同问题",如果你明白我的意思.因此,如果以下方法对您不起作用,请不要交叉!
将那么多数据加载到内存中总会产生一些影响,但是,我想我看到你在做什么......
当天真地加载那么多数据时,你将拥有许多(数百万?)个对象和相似或更多数量的引用.你显然想要使用x64,所以引用会加起来 - 但就性能而言,最大的问题是垃圾收集.你有很多的对象的不能被收集,但GC是要知道你正在使用一吨的内存,并会尝试反正周期性.这是我在这里详细介绍的内容,但下图显示了影响 - 特别是那些"尖峰"都是GC杀戮性能:

对于这种情况(大量数据加载,从未发布),我们切换到使用结构,即将数据加载到:
struct Foo {
private readonly int id;
private readonly double value;
public Foo(int id, double value) {
this.id = id;
this.value = value;
}
public int Id {get{return id;}}
public double Value {get{return value;}}
}
Run Code Online (Sandbox Code Playgroud)
并将它们直接存储在数组(不是列表)中:
Foo[] foos = ...
Run Code Online (Sandbox Code Playgroud)
其重要性在于,由于其中一些结构非常大,我们不希望它们在堆栈上复制很多次,但是使用数组可以做到:
private void SomeMethod(ref Foo foo) {
if(foo.Value == ...) {blah blah blah}
}
// call ^^^
int index = 17;
SomeMethod(ref foos[index]);
Run Code Online (Sandbox Code Playgroud)
请注意,我们直接传递了对象- 它从未被复制过; foo.Value实际上直接在数组内部查找.当您需要对象之间的关系时,棘手的位开始.您不能在此处存储引用,因为它是a struct,您无法存储它.但是,您可以做的是存储索引(到数组中).例如:
struct Customer {
... more not shown
public int FooIndex { get { return fooIndex; } }
}
Run Code Online (Sandbox Code Playgroud)
不太方便customer.Foo,但以下工作很好:
Foo foo = foos[customer.FooIndex];
// or, when passing to a method, SomeMethod(ref foos[customer.FooIndex]);
Run Code Online (Sandbox Code Playgroud)
关键点:
int是4个字节; x64上的引用是8个字节)补充说明:
string.Intern,那将是坏的),以确保你只有一个每个重复值的实例,而不是800,000个具有相同内容的字符串fixed数组; 这需要unsafe代码,但避免了另外无数的对象和引用作为一个额外的脚注,有了这么多的数据,你应该非常认真地考虑你的序列化协议,即你如何通过网络发送数据.我强烈建议远离类似的东西XmlSerializer,DataContractSerializer或者BinaryFormatter.如果您想了解这个主题,请告诉我.
| 归档时间: |
|
| 查看次数: |
2414 次 |
| 最近记录: |