ConcurrentDictionary 内存效率

ConcurrentDictionary Memory efficiency

为了让您了解上下文:我正在使用 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。

有人可以给我建议吗?如果您想查看完整代码,我在回购协议中留下了 link: https://github.com/joalcava/Kmeans-CS/blob/master/Kmeans/KMeans.cs

每个字典往往有一些与之相关的开销:几个 ints 和一些对象引用,即使它是空的,然后是 space 它需要的两倍,一旦你开始添加项目。我假设 ConcurrentDictionary 几乎相同。

因此,与其在每个点上都放置一个新的 ConcurrentDictionary,您可能想尝试使用一个 ConcurrentDictionary,该 ConcurrentDictionary 以点数组索引和您当前使用的键为键。 C# 7 的新元组语法应该可以很容易地做到这一点。