You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多表SQL记录转CSV性能优化及Azure函数部署适配

代码性能优化方案

核心性能瓶颈在循环内遍历评论表查找匹配项,每次查找都是O(m)复杂度,3万条记录×1万条评论就是3亿次操作,这是拖慢速度的元凶。下面是具体优化方案:


1. 用Dictionary缓存评论数据(最关键优化)

将评论表数据提前加载到Dictionary中,把查找复杂度从O(n*m)降到O(n+m),每次匹配仅需O(1)时间:

// 预处理评论数据到Dictionary,提前截断评论长度
int htmlCommentaryLength = 5000;
var commentDict = commentriesDataset.Tables[0].Rows.Cast<DataRow>()
    .ToDictionary(
        row => row["CommentaryID"].ToString()!,
        row => 
        {
            var comment = row["Comment"].ToString() ?? string.Empty;
            return comment.Length >= htmlCommentaryLength ? comment[..htmlCommentaryLength] : comment;
        });

2. 优化数字判断逻辑

原代码用字符遍历判断是否为纯数字,效率低且不准确。改用int.TryParse直接验证,更高效可靠:

string? commentryValue = dr["VariationReasonsCommentary"]?.ToString();
if (!string.IsNullOrEmpty(commentryValue))
{
    if (!int.TryParse(commentryValue, out _))
    {
        // 非数字,直接写入截断后的原内容
        var truncated = commentryValue.Length >= htmlCommentaryLength ? commentryValue[..htmlCommentaryLength] : commentryValue;
        csvWriter.WriteField(truncated);
    }
    else
    {
        // 数字ID,从字典快速查找
        if (commentDict.TryGetValue(commentryValue, out var comment))
        {
            csvWriter.WriteField(comment);
        }
        else
        {
            csvWriter.WriteField(string.Empty);
        }
    }
}
else
{
    csvWriter.WriteField(string.Empty);
}

3. 缓存DataTable列集合

提前缓存列数组,避免每次循环重复遍历dt.Columns:

// 提前缓存列数组
var columns = dt.Columns.Cast<DataColumn>().ToArray();

// 写入表头
foreach (var dc in columns)
{
    csvWriter.WriteField(dc.ColumnName);
}
csvWriter.WriteField("Comment");
csvWriter.NextRecord();

// 写入数据行时复用缓存的列
foreach (DataRow dr in dt.Rows)
{
    foreach (var dc in columns)
    {
        csvWriter.WriteField(dr[dc]);
    }
    // ... 处理Comment列的逻辑
}

4. 优化CSV写入IO效率

  • 给StreamWriter设置更大缓冲区,减少磁盘IO次数:
    using var writer = new StreamWriter($"C:\\Work\\{fileName}", append: false, bufferSize: 8192);
    
  • 部署到Azure函数时,直接写入Blob存储而非本地文件(比如用BlobClient.OpenWriteAsync获取流),避免本地磁盘瓶颈;
  • 改用CsvWriter的异步方法(WriteFieldAsync、NextRecordAsync)配合await,提升异步IO效率。

5. 细节优化

  • 简化判空逻辑:string.IsNullOrEmpty(commentryValue) == false改为!string.IsNullOrEmpty(commentryValue);
  • Azure函数环境中使用临时存储路径:Path.Combine(Path.GetTempPath(), fileName),避免本地路径不存在问题。

内容的提问来源于stack exchange,提问作者Ali

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 11:20:55