Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 二进制搜索-如何加载+;将一个文件中的500万条记录放入范围<;int>;[]阵列?_C#_Binary Search - Fatal编程技术网

C# 二进制搜索-如何加载+;将一个文件中的500万条记录放入范围<;int>;[]阵列?

C# 二进制搜索-如何加载+;将一个文件中的500万条记录放入范围<;int>;[]阵列?,c#,binary-search,C#,Binary Search,这个问题是我上一个关于二进制搜索()的问题的后续问题 我有顺序文本文件,有超过5百万条记录/行,格式如下。我需要将其加载到范围[]数组中。如何及时做到这一点 文件格式: start int64,end int64,result int start int64,end int64,result int start int64,end int64,result int start int64,end int64,result int ... 这是一个典型的(?),可以使用多个线程来解决。在您的情况

这个问题是我上一个关于二进制搜索()的问题的后续问题

我有顺序文本文件,有超过5百万条记录/行,格式如下。我需要将其加载到
范围[]
数组中。如何及时做到这一点

文件格式:

start int64,end int64,result int
start int64,end int64,result int
start int64,end int64,result int
start int64,end int64,result int
...
这是一个典型的(?),可以使用多个线程来解决。在您的情况下,生产者从磁盘读取数据,消费者解析行并填充阵列。我可以看到两种不同的情况:

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

可能会帮助您在C#中实现这一点。

我假设您有一个好磁盘。扫描文件一次,并计算条目数。如果可以保证文件中没有空行,那么只需计算其中的换行数,而不必实际分析每一行

现在,您可以一次分配一个包含那么多条目的数组。这样可以避免阵列的过度重新分配:

var numEntries = File.ReadLines(filepath).Count();
var result = new Range<int>[numEntries];
var numEntries=File.ReadLines(filepath.Count();
var结果=新范围[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;
var i=0;
foreach(File.ReadLines(filepath)中的var行)
{
var parts=line.Split(',');
结果[i++]=新范围(long.Parse(部分[0])、long.Parse(部分[1])、int.Parse(部分[2]);
}
返回结果;

根据需要添加一些错误处理。此代码很容易理解。请在目标环境中试用。如果速度太慢,则可以开始优化。但我不会过早优化,因为这将导致可能不需要的更复杂的代码。

我猜他最终会出现第二种情况。磁盘IO几乎肯定会成为这里的瓶颈。@Servy是的,我在想同样的事情,你会在开始时花更多的时间计算行数,而不仅仅是使用
列表
和处理重新分配的内部缓冲区。磁盘IO比复制内存中已经存在的数据要昂贵得多,只要你愿意没有处理太大以至于无法放入内存的数据集(这是不可能的)。不确定为什么会有这么多没有注释的否决票…似乎是一个完全合理的问题。。。