让你进入上下文:我正在使用C#中的netflix数据集实现KMeans算法。
数据集具有以下形式:
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];
...
}
问题是一旦加载数据集在RAM中占用4gb,我就会手动触发垃圾收集器并将内存使用量减少到一半(2gb)但是我正在寻找更好的ram使用方式,因为我已经用C ++解决了这个问题,RAM中的数据集只有500mb。
有人可以就此给我建议吗?如果您想查看完整代码,我会留下一个指向repo的链接: https://github.com/joalcava/Kmeans-CS/blob/master/Kmeans/KMeans.cs
答案 0 :(得分:1)
每个词典往往会有一些与之相关的开销:几个int
和一些对象引用,即使它是空的,然后在开始添加项目时需要两倍的空间。我认为ConcurrentDictionary
几乎是一样的。
因此,您可能希望尝试使用单个ConcurrentDictionary来锁定点数组索引和当前正在使用的密钥,而不是在每个Point上放置一个新的ConcurrentDictionary。 C#7的新元组语法应该很容易实现。