【发布时间】:2010-03-17 22:12:05
【问题描述】:
我正在创建一个自定义数据集,但我受到一些限制:
- 我希望用户指定他们想要存储的数据类型。
- 我想减少类型转换,因为我认为这会非常昂贵。
- 我会在我的应用程序中非常频繁地使用这些数据。
我不知道DataSet中会存储什么类型的数据,所以我最初的想法是把它做成objects的List,但是我怀疑数据的频繁使用和需要类型转换将非常昂贵。
基本思路是这样的:
class DataSet : IDataSet
{
private Dictionary<string, List<Object>> _data;
/// <summary>
/// Constructs the data set given the user-specified labels.
/// </summary>
/// <param name="labels">
/// The labels of each column in the data set.
/// </param>
public DataSet(List<string> labels)
{
_data = new Dictionary<string, List<object>>();
foreach (string label in labels)
{
_data.Add(label, new List<object>());
}
}
#region IDataSet Members
public List<string> DataLabels
{
get { return _data.Keys.ToList(); }
}
public int Count
{
get { _data[_data.Keys[0]].Count; }
}
public List<object> GetValues(string label)
{
return _data[label];
}
public object GetValue(string label, int index)
{
return _data[label][index];
}
public void InsertValue(string label, object value)
{
_data[label].Insert(0, value);
}
public void AddValue(string label, object value)
{
_data[label].Add(value);
}
#endregion
}
将使用DataSet 的具体示例是存储从第一列包含标签的CSV 文件中获得的数据。当从CSV 文件加载数据时,我想指定类型而不是转换为object。数据可能包含日期、数字、字符串等列。如下所示:
"Date","Song","Rating","AvgRating","User"
"02/03/2010","Code Monkey",4.6,4.1,"joe"
"05/27/2009","Code Monkey",1.2,4.5,"jill"
这些数据将用于机器学习/人工智能算法,因此我必须非常快速地读取数据。我想尽可能地消除类型转换,因为我不能在每次读取时从“对象”转换为所需的任何数据类型。
我已经看到允许用户为 csv 文件中的每个项目选择特定数据类型的应用程序,因此我正在尝试制作一个类似的解决方案,其中可以为每列指定不同的类型。我想创建一个通用解决方案,因此我不必返回 List<object>,而是返回 List<DateTime>(如果它是 DateTime 列)或 List<double>(如果它是双精度列)。
有什么方法可以实现吗?也许我的方法是错误的,有没有更好的方法来解决这个问题?
【问题讨论】:
-
您期望 CSV 文件有多少种变体?
-
您为什么认为类型转换会成为瓶颈?你做过测试吗?
-
@Jeff 我不知道我会有多少 CSV 文件的变体...我希望程序能够处理出现的任何 CSV 文件和格式。
-
@mmyers 我不认为类型转换会成为瓶颈,但我正在构建的框架花费大约 90% 的时间来读取数据,有时还会调用对数据进行计算的函数(计算函数使用记忆来减少函数调用)。我怀疑我会看到类型转换的性能下降,虽然我还没有做过任何测试(现在会做)。
-
@Lirik:你还没有做任何测试?嘘!你会召唤迈克·邓拉维!