gpt4 book ai didi

c# - 需要加速转换时间戳的 C# 应用程序

转载 作者:太空狗 更新时间:2023-10-30 00:54:27 26 4
gpt4 key购买 nike

我很难让小型应用程序更快地运行。我不是开发人员,我花了一些时间才让它按原样工作。任何人都可以提供任何建议或替代代码来加快此过程,处理 10m 输入文件大约需要 1 小时。

下面列出了代码,这里是输入文件的示例。

4401,imei:0000000000,2012-09-01 12:12:12.9999

using System;
using System.Globalization;
using System.IO;

class Sample
{
public static void Main(string[] args)
{
if (args.Length == 0)
{
return;
}


using (FileStream stream = File.Open(args[0], FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{

using (StreamReader streamReader = new StreamReader(stream))
{
System.Text.StringBuilder builder = new System.Text.StringBuilder();
while (!streamReader.EndOfStream)
{
var line = streamReader.ReadLine();
var values = line.Split(',');
DateTime dt = new DateTime();
DateTime.TryParse(values[2], out dt);
values[2] = Convert.ToString(dt.Ticks);

string[] output = new string[values.Length];
bool firstColumn = true;
for (int index = 0; index < values.Length; index++)
{
if (!firstColumn)
builder.Append(',');
builder.Append(values[index]);
firstColumn = false;

}
File.WriteAllText(args[1], builder.AppendLine().ToString());

}
}
}
}
}

最佳答案

最大的性能损失是每次读取一行时,整个文件(到目前为止已处理)都会写回磁盘。为了快速取胜,请尝试将您的 StringBuilder 移出循环:

            System.Text.StringBuilder builder = new System.Text.StringBuilder();

using (FileStream stream = File.Open(args[0], FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
using (StreamReader streamReader = new StreamReader(stream))
{
while (!streamReader.EndOfStream)
{
var line = streamReader.ReadLine();
var values = line.Split(',');
DateTime dt = new DateTime();
DateTime.TryParse(values[2], out dt);
values[2] = Convert.ToString(dt.Ticks);

string[] output = new string[values.Length];
bool firstColumn = true;
for (int index = 0; index < values.Length; index++)
{
if (!firstColumn)
builder.Append(',');
builder.Append(values[index]);
firstColumn = false;
}
builder.AppendLine();
}
}
}

File.WriteAllText(args[1], builder.ToString());

如果你想重构进一步改变逗号分隔逻辑:

            System.Text.StringBuilder builder = new System.Text.StringBuilder();

using (FileStream stream = File.Open(args[0], FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
using (StreamReader streamReader = new StreamReader(stream))
{
while (!streamReader.EndOfStream)
{
var line = streamReader.ReadLine();
var values = line.Split(',');
DateTime dt = new DateTime();
DateTime.TryParse(values[2], out dt);
values[2] = Convert.ToString(dt.Ticks);

builder.AppendLine(string.Join(",", values));
}
}
}

File.WriteAllText(args[1], builder.ToString());

编辑:为避免内存使用,删除Stringbuilder 并使用另一个FileStream 写入磁盘。您提出的解决方案(使用 List)仍将使用大量内存,并且可能会中断较大的文件:

        using (FileStream input = File.Open(args[0], FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
using (FileStream output = File.Create(args[1]))
{
using (StreamReader streamReader = new StreamReader(input))
using (StreamWriter streamWriter = new StreamWriter(output))
{
while (!streamReader.EndOfStream)
{
var line = streamReader.ReadLine();
var values = line.Split(',');
DateTime dt = new DateTime();
DateTime.TryParse(values[2], out dt);
values[2] = Convert.ToString(dt.Ticks);

streamWriter.WriteLine(string.Join(",", values));
}
}
}

关于c# - 需要加速转换时间戳的 C# 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12830892/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com