-1

这个问题是我之前关于二分搜索的问题(针对 +5M 记录表的快速内存范围查找)的后续问题。

我有超过 500 万条记录/行的顺序文本文件,格式如下。我需要将它加载到Range<int>[]数组中。如何及时做到这一点?

文件格式:

start int64,end int64,result int
start int64,end int64,result int
start int64,end int64,result int
start int64,end int64,result int
...
4

2 回答 2

0

这是一个典型的(?)生产者-消费者问题,可以使用多个线程来解决。在您的情况下,生产者正在从磁盘读取数据,而消费者正在解析行并填充数组。我可以看到两种不同的情况:

  • 生产者(生产者)比消费者快得多:在这种情况下,您应该尝试使用更多消费者线程;
  • 消费者比生产者快得多:除了影响硬件配置(例如购买更快的硬盘或使用 RAID 0)之外,您无法做太多事情来加快速度。在这种情况下,我什至不会使用多线程解决方案,因为它不值得增加复杂性。

这个问题可能会帮助您在 C# 中实现它。

于 2013-03-07T16:33:59.547 回答
0

我会假设你有一个好的磁盘。扫描文件一次并计算条目数。如果你能保证你的文件没有空行,那么你可以只计算其中的换行数——实际上不要解析每一行。

现在,您可以使用恰好那么多条目分配一次数组。这避免了数组的过度重新分配:

var numEntries = File.ReadLines(filepath).Count();
var result = new Range<int>[numEntries];

现在再次读取文件并使用以下代码创建范围对象:

var i = 0;
foreach (var line in File.ReadLines(filepath))
{
   var parts = line.Split(',');
   result[i++] = new Range<int>(long.Parse(parts[0]), long.Parse(parts[1]), int.Parse(parts[2]);
}

return result;

根据需要加入一些错误处理。这段代码很容易理解。在您的目标环境中尝试一下。如果它太慢,那么你可以开始优化它。我不会过早地优化,因为这会导致可能不需要的更复杂的代码。

于 2013-03-07T17:21:49.400 回答