c# - 如何提高循环效率
问题描述
我正在尝试将我的数据保存到 csv 文件。当速率很小(保存 2,000/s)时,它工作得很好。但是当增加到20,000 / s时,它的工作速度很慢。
class Channel
{
List<double> RawData { get; set; }
...
}
-----------------------------------
var channels = new List<Channel>();
// after fetch the data
var sw = new StreamWriter(FileStream, Encoding.Default);
for (i = 0; channels.First().RawData.Count; i ++)
{
string line = DateTime.Now.ToString() + ",";
line += string.Join(',', channels.Select(c => c.RawData[i]));
sw.WriteLine(line);
sw.Flush();
}
当RawData
每个的计数channel
达到 20,000 时,应用程序将运行缓慢。有什么办法可以加快生成速度line
吗?
解决方案
您可以采取一些措施来加快速度。
通常,I/O 操作是昂贵的(最慢的),所以尽量避免做很多,而是只写一次或几次。
当您多次执行此操作时,修改字符串也很慢。因此,您应该使用 StringBuilder。
最后,在我看来,您使用的日期时间在许多情况下(但可能不是全部!)都是相同的值。如果是这种情况,那么您可以只调用一次,然后输出相同的值。
您也许还可以加快频道 Select 语句(根据其他帖子)。
那么你会有这样的代码:
StringBuilder sb = new StringBuilder();
string dtValue = DateTime.Now.ToString();
for (int i = 0; channels.First().RawData.Count; i++)
{
sb.Append(dtValue).Append(",").Append(channels.First().RawData[i]).Append(Environment.NewLine);
}
//Write just once.
using (var sw = new StreamWriter(FileStream, Encoding.Default))
{
sw.Writeline(sb.ToString());
sw.Close();
}
编辑:根据评论更新为使用 channels.First().RawData[i]。
推荐阅读
- python - python创建列表通过SQL查询
- python - 如何用 Python 中的第 95 和第 5 个百分位替换异常值?
- dask - 使用 dask.array.store 到 hdf5 文件时,Dask 分布式 LocalCluster 失败并显示“TypeError:无法腌制 _thread._local 对象”
- html - 具有多个列表项的元素比具有单个列表项的元素推得更高
- c# - Azure DevOps:未找到带有 WikiHttpClient 的 Wiki 页面
- typescript - 反转必需和可选属性
- jquery - 如何在 laravel 的 jquery 中调用 ajax
- laravel - 批量更新多列时出错
- c++ - 使用指针将第一个(2D)数组的值复制到第二个的函数
- elasticsearch - simple_query_string 检查字段是否存在