我有一个读取百万行文件的程序。每行上都有一个浮点值。该值将被读入并放入数组中的元素中。
using System;
using System.Diagnostics;
using System.IO;
namespace sort1mRandFloat
{
public class Program
{
static void Main()
{
Console.WriteLine("Creating Single array...");
Single[] fltArray = new Single[1000000];
Console.WriteLine("Array created, making string...");
String line;
Console.WriteLine("String created, opening file...");
StreamReader file = new StreamReader(@"C:\\Users\\Aaron\\Desktop\\rand1mFloats.txt");
Console.WriteLine("File opened, creating stopwatch and starting main execution event. See you on the other side.");
int i;
Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();
while((line = file.ReadLine()) != null)
{
for(i=0; i < 1000000; i++)
{
fltArray[i] = Convert.ToSingle(line);
if (i == 999999)
Console.WriteLine("At 999999");
}
}
file.Close();
stopWatch.Stop();
TimeSpan ts = stopWatch.Elapsed;
String elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds/10);
Console.WriteLine("It took " + elapsedTime + " to read a thousand lines into the array.\n");
Console.WriteLine("Element 0 is: " + fltArray[0]);
Console.WriteLine("Element 999999 is: " + fltArray[999999]);
Console.ReadLine();
}
}
}
当在文件上运行此代码时,它永远不会停止。它正在寻找一些东西告诉它它是在瓷砖的末端或其他什么东西,并没有找到它。在填充第999,999个元素后,它会循环回0并重新开始。
此代码或多或少基于Microsoft在其网站上推荐的内容...对我做错的任何想法?
该文件可在下面找到。由于我还没能将文件存储在数组中,我不能说它需要多长时间才能工作。文件中有很多值。计量连接警告:18 MB文件。
答案 0 :(得分:4)
for
内不应该有while
。你只需要一个循环:
var i = 0;
while((line = file.ReadLine()) != null)
{
fltArray[i] = Convert.ToSingle(line);
if (i == 999999)
Console.WriteLine("At 999999");
i++;
}
或for
:
for(i=0; i < 1000000 && (line = file.ReadLine()) != null; i++)
{
fltArray[i] = Convert.ToSingle(line);
if (i == 999999)
Console.WriteLine("At 999999");
}
<强>更新强>
我收到了您的文件的结果:
Creating Single array...
Array created, making string...
String created, opening file...
File opened, creating stopwatch and starting main execution event. See you on the other side.
At 999999
It took 00:00:00.42 to read a thousand lines into the array.
Element 0 is: 0,9976465
Element 999999 is: 0,04730097
发布版本,在VS之外运行,i5-3317U @ 1.7GHz。
答案 1 :(得分:1)
我在打电话,所以我为简洁而道歉。你的外部while循环将击中你的100万行中的每一行,你的内部for循环迭代100万次,总共1万亿次迭代。此外,您的while条件可以使用file.EndOfStream属性。
答案 2 :(得分:1)
基本上你将每行转换1000000次,因为你的while循环中有for循环来读取。
只需删除for循环并将其替换为i ++
每次调用file.ReadLine时,它都会从文件中读取一行,直到它到达文件末尾并变为null(因此退出while循环)。