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
每个字典往往有一些与之相关的开销:几个 int
s 和一些对象引用,即使它是空的,然后是 space 它需要的两倍,一旦你开始添加项目。我假设 ConcurrentDictionary
几乎相同。
因此,与其在每个点上都放置一个新的 ConcurrentDictionary,您可能想尝试使用一个 ConcurrentDictionary,该 ConcurrentDictionary 以点数组索引和您当前使用的键为键。 C# 7 的新元组语法应该可以很容易地做到这一点。
为了让您了解上下文:我正在使用 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
每个字典往往有一些与之相关的开销:几个 int
s 和一些对象引用,即使它是空的,然后是 space 它需要的两倍,一旦你开始添加项目。我假设 ConcurrentDictionary
几乎相同。
因此,与其在每个点上都放置一个新的 ConcurrentDictionary,您可能想尝试使用一个 ConcurrentDictionary,该 ConcurrentDictionary 以点数组索引和您当前使用的键为键。 C# 7 的新元组语法应该可以很容易地做到这一点。