我一直在使用EF并使用CsvHelper将测试输出直接映射到数据库实体以便快速存储。我现在遇到一个跟踪cpu核心,端口io和核心/端口配对数据的性能监视器的问题。我可以拥有任意数量的内核和任意数量的端口,这些端口在核心/端口配对中成倍增加。输出是csv格式,我无法控制这种输出格式。
我需要有效地将这个动态列大小的csv扫描到实体模型中。我希望我可以用最少的操作将列映射到各个表。
EF的POCO配对示例:
public class CpuTesting
{
[Key]
public int Id { get; set; }
public int Socket { get; set; }
public int Core { get; set; }
public double ProcessorTime { get; set; }
public virtual ICollection<PortCorePairing> PortCorePairings { get; set; }
}
public class PortIo
{
[Key]
public int Id { get; set; }
public Int64 BytesReceivedTotal { get; set; }
public Int64 BytesSentTotal { get; set; }
}
public class PortCorePairing
{
[Key]
public int Id { get; set; }
public int CpuTestingId { get; set; }
public int InteruptPerSecond { get; set; }
public int DiscardedSent { get; set; }
public int DiscardedReceived { get; set; }
[ForeignKey("CpuTestingId")]
public virtual CpuTesting CpuTesting { get; set; }
}
大量简化的标题行,它映射到(相信我,它是释义...我通常处理200+列的单个端口测试,这就是为什么我希望找到更好的方法映射)。
Cpu(0,0) ProcTime, Cpu(0,1) ProcTime, Cpu(1,0) ProcTime, Cpu(1,1) ProcTime, Port(0) BytesRecTotal, Port(0) BytesSentTotal, Port(1) BytesRecTotal, Port(1) BytesSentTotal, Cpu(0,0) Port(0) CoreIntPerSec, Cpu(0,0) Port(0) Discarded, Cpu(0,1) Port(0) CoreIntPerSec, Cpu(0,1) Port(0) Discarded, Cpu(1,0) Port(1) CoreIntPerSec, Cpu(1,0) Port(1) Discarded, Cpu(1,1) Port(1) CoreIntPerSec, Cpu(1,1) Port(1) Discarded
现在,我看到这一点的唯一方法是预处理标题行以解析集合中的列(按索引映射),通过csv文件迭代进展。这有很多开销,涉及映射和自动映射。标题会在多个位置更改文本,这使得映射需要键入标题中的子字符串。
上面的CSV标题仅为模式示例: 包含的csv标题只是问题的修剪模式。如果我更改端口的品牌/型号,我会获得端口的新名称,而不是端口。正在测试的下一个系统可能每个CPU有12个核心和/或4个端口。从字面上看,我现在面前有一个数据集,有4个cpus @ 12核心ea。,4个端口,配对最终接近1200列。