将整数列表写入文件的最快方法
Fastest way to write a list of integers to file
我有一个需要写入文件的整数列表。
我想知道是否有比这种需要 1.77 秒的方法更快地将这些整数写入文件的方法?
(列表从一开始就有整数,因为它们在其他需要整数进行快速计算的函数中被处理为整数)
void writeToFile()
{
List<int> list1 = new List<int>();
for (int i = 0; i < 5000000; i++)
{
list1.Add(123);
}
//Approach takes: 1.77 seconds
DateTime start = DateTime.Now;
StreamWriter writer = null; FileStream fs = null;
fs = new FileStream("C:/test.txt", FileMode.Append, FileAccess.Write, FileShare.ReadWrite);
writer = new StreamWriter(fs);
for (int i = 0; i < list1.Count; i++)
{
writer.WriteLine(list1[i]);
}
writer.Close(); fs.Close();
DateTime end = DateTime.Now;
TimeSpan span = end - start;
MessageBox.Show(span.TotalSeconds.ToString());
}
使用 BufferedStream
无济于事,因为 FileStream
已经有了缓冲区。
使用 BinaryWriter
会有所帮助,因为您将写入 4 个字节(一个整数)而不是 6* 个字节(三个 2 个字节的字符,我们也应该计算换行符)5 000 000 次。但是写入的文件将是二进制的。它不再是人类可读的。
在你的例子中,因为你总是写相同的数字 123
,我认为使用压缩也会有一些神奇的作用 ;)
这种方法使用 BinaryWriter VS StreamWriter 需要 0.4 秒(1.77 秒)。
不知是否可以进一步提高速度?
void writeToFile()
{
List<int> list1 = new List<int>();
for (int i = 0; i < 5000000; i++)
{
list1.Add(i);
}
//Approach takes: 0.4 seconds
DateTime start = DateTime.Now;
BinaryWriter writer = null; FileStream fs = null;
fs = new FileStream("C:/test.txt", FileMode.Append, FileAccess.Write, FileShare.ReadWrite, 65536); writer = new BinaryWriter(fs);
for (int i = 0; i < list1.Count; i++)
{
writer.Write(list1[i]);
}
writer.Close(); fs.Close();
DateTime end = DateTime.Now;
TimeSpan span = end - start;
MessageBox.Show(span.TotalSeconds.ToString()); //Takes 0.4 seconds
//Read the integers method
using (BinaryReader b = new BinaryReader(File.Open("C:/test.txt", FileMode.Open)))
{
// 2.
// Position and length variables.
int pos = 0;
// 2A.
// Use BaseStream.
int length = (int)b.BaseStream.Length;
while (pos < length)
{
// 3.
// Read integer.
int v = b.ReadInt32();
// 4.
// Advance our position variable.
pos += sizeof(int);
}
}
}
我有一个需要写入文件的整数列表。
我想知道是否有比这种需要 1.77 秒的方法更快地将这些整数写入文件的方法?
(列表从一开始就有整数,因为它们在其他需要整数进行快速计算的函数中被处理为整数)
void writeToFile()
{
List<int> list1 = new List<int>();
for (int i = 0; i < 5000000; i++)
{
list1.Add(123);
}
//Approach takes: 1.77 seconds
DateTime start = DateTime.Now;
StreamWriter writer = null; FileStream fs = null;
fs = new FileStream("C:/test.txt", FileMode.Append, FileAccess.Write, FileShare.ReadWrite);
writer = new StreamWriter(fs);
for (int i = 0; i < list1.Count; i++)
{
writer.WriteLine(list1[i]);
}
writer.Close(); fs.Close();
DateTime end = DateTime.Now;
TimeSpan span = end - start;
MessageBox.Show(span.TotalSeconds.ToString());
}
使用 BufferedStream
无济于事,因为 FileStream
已经有了缓冲区。
使用 BinaryWriter
会有所帮助,因为您将写入 4 个字节(一个整数)而不是 6* 个字节(三个 2 个字节的字符,我们也应该计算换行符)5 000 000 次。但是写入的文件将是二进制的。它不再是人类可读的。
在你的例子中,因为你总是写相同的数字 123
,我认为使用压缩也会有一些神奇的作用 ;)
这种方法使用 BinaryWriter VS StreamWriter 需要 0.4 秒(1.77 秒)。
不知是否可以进一步提高速度?
void writeToFile()
{
List<int> list1 = new List<int>();
for (int i = 0; i < 5000000; i++)
{
list1.Add(i);
}
//Approach takes: 0.4 seconds
DateTime start = DateTime.Now;
BinaryWriter writer = null; FileStream fs = null;
fs = new FileStream("C:/test.txt", FileMode.Append, FileAccess.Write, FileShare.ReadWrite, 65536); writer = new BinaryWriter(fs);
for (int i = 0; i < list1.Count; i++)
{
writer.Write(list1[i]);
}
writer.Close(); fs.Close();
DateTime end = DateTime.Now;
TimeSpan span = end - start;
MessageBox.Show(span.TotalSeconds.ToString()); //Takes 0.4 seconds
//Read the integers method
using (BinaryReader b = new BinaryReader(File.Open("C:/test.txt", FileMode.Open)))
{
// 2.
// Position and length variables.
int pos = 0;
// 2A.
// Use BaseStream.
int length = (int)b.BaseStream.Length;
while (pos < length)
{
// 3.
// Read integer.
int v = b.ReadInt32();
// 4.
// Advance our position variable.
pos += sizeof(int);
}
}
}