ConcurrentDictionary内存效率

时间:2018-05-09 15:12:13

标签: c# optimization parallel-processing k-means concurrentdictionary

让你进入上下文:我正在使用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

1 个答案:

答案 0 :(得分:1)

每个词典往往会有一些与之相关的开销:几个int和一些对象引用,即使它是空的,然后在开始添加项目时需要两倍的空间。我认为ConcurrentDictionary几乎是一样的。

因此,您可能希望尝试使用单个ConcurrentDictionary来锁定点数组索引和当前正在使用的密钥,而不是在每个Point上放置一个新的ConcurrentDictionary。 C#7的新元组语法应该很容易实现。