为了让您了解上下文:我正在使用C#中的netflix实现C#算法。
数据集具有以下形式:
8: // This is the movie id
23414, 3, 16/5/2009 //User id, rate, date我将数据作为稀疏点存储在以下数据结构中:
struct Point {
double Norm {get; set;} // Vector norm
ConcurrentDictionary<ushort, double> Values; // {movie:rate, ...}
void CalculateNorm() { ... }
}
public class KMeans {
...
Point[] _dataset = new Point[470758];
...
}问题是,一旦加载数据集占用内存中的4gb,我就会手动触发垃圾收集器,它将内存使用量减少到一半(2gb),但我正在寻找更多最佳使用RAM的方法,因为我已经在C++中解决了这个问题,数据集在内存中只有500 2gb。
有人能给我一些建议吗?如果您想查看完整的代码:https://github.com/joalcava/Kmeans-CS/blob/master/Kmeans/KMeans.cs,我留下了一个到回购程序的链接。
发布于 2018-05-09 15:37:47
每个字典都有一些与它相关的开销:几个int和一些对象引用,即使它是空的,然后当您开始添加项时,它所需要的空间就会增加两倍。我猜想ConcurrentDictionary与之差不多。
因此,与其在每个点上设置一个新的ConcurrentDictionary,不如尝试使用一个点数组索引和当前正在使用的键的单一ConcurrentDictionary。C# 7的新元组语法应该会使这非常容易实现。
https://stackoverflow.com/questions/50256712
复制相似问题