【问题标题】:Optimizing load and search speeds ASP.NET C#优化加载和搜索速度 ASP.NET C#
【发布时间】:2015-12-31 23:05:03
【问题描述】:

我对 ASP.NET 完全陌生,但是经过一些基础知识的努力,并且感谢 google,我设法设置了一个页面来满足我的需求。

Web 应用程序应该从我在本地主机上使用另一个 Windows 应用程序生成的 XML 文件加载数据,显示这些数据并允许用户搜索它。

此 XML 文件有超过 50 MB 和超过 120.000 个条目。

我正在将此 XML 文件读入数据集,然后绑定到 gridView。

问题是:

  • 当我第一次加载页面时,最多可能需要 30 秒
  • 当我搜索数据时,加载可能需要 10 秒以上

我该如何解决这个问题? 我尝试了 StateView,但这会导致“内存不足”异常。 我做了一些研究,看来我可以将此数据集保存在服务器缓存中,这样所有用户都可以立即访问它,而无需每次为每个用户重新加载 XML?

这是我目前的代码,如果有问题请告诉我,因为我不了解 ASP.NET。谢谢。

 public DataSet ds = new DataSet();
    public DataSet resultDS = new DataSet();
    public bool searchListActive = false;
    string _sortDirection = "";

    protected void Page_Load(object sender, EventArgs e)
    {
        BindGrid();
        if (!IsPostBack)
        {
            gridView_IndexData.PageSize = Convert.ToInt32(ddList_DataCount.SelectedItem.Value);
            ViewState["searchListActive"] = false;
            BindCB();
        }

        gridView_IndexData.PageSize = Convert.ToInt32(ddList_DataCount.SelectedItem.Value);
    }



    void BindGrid()
    {
        ds.ReadXml(Server.MapPath("~/lstData.xml"));
        gridView_IndexData.DataSource = ds;
        gridView_IndexData.DataBind();
    }

    void BindCB()
    {
        DataTable dt = ds.Tables[0].DefaultView.ToTable(true, "forumName");
        var DR = dt.NewRow();
        DR["forumName"] = "All forums";
        dt.Rows.InsertAt(DR, 0);
        dt.AcceptChanges();
        ddList_Forum.DataSource = dt;
        ddList_Forum.DataTextField = "forumName";
        ddList_Forum.DataBind();
    }



    protected void btnSearchQuery_Click(object sender, EventArgs e)
    {
        resultDS = ds.Clone();

        string searchQuery = "";

        searchQuery = "TopicTitle LIKE '%" + tbSearchInput.Text + "%'";

        if (tbSearchByUsername.Text.Length > 0)
        {
            searchQuery += "AND UserName ='" + tbSearchByUsername.Text + "'";
        }

        if (ddList_Type.Text != "")
        {
            searchQuery += "AND Type ='" + ddList_Type.Text + ":'";
        }

        if (ddList_Forum.Text != "All forums")
        {
            searchQuery += "AND forumName ='" + ddList_Forum.Text + "'";
        }


        var results = ds.Tables[0].Select(searchQuery);
        resultDS.Tables.Add();

        foreach (DataRow dr in results)
        {
            resultDS.Tables[0].ImportRow(dr);
        }

        resultDS.AcceptChanges();
        gridView_IndexData.DataSource = resultDS.Tables[0];
        ViewState["searchListActive"] = true;
        ViewState["resultDS"] = resultDS;
        gridView_IndexData.DataBind();

    }

    protected void gridView_IndexData_Sorting(object sender, GridViewSortEventArgs e)
    {
        SetSortDirection(e.SortDirection.ToString());
        ds.Tables[0].DefaultView.Sort = e.SortExpression + " " + _sortDirection;
        gridView_IndexData.DataSource = ds.Tables[0];
        gridView_IndexData.DataBind();
    }

    void SetSortDirection(string sortDirection)
    {
        if (sortDirection == "Descending")
        {
            _sortDirection = "DESC";
        }
        else
        {
            _sortDirection = "ASC";
        }
    }

    protected void gridView_IndexData_PageIndexChanging(object sender, GridViewPageEventArgs e)
    {
        gridView_IndexData.PageIndex = e.NewPageIndex;
        if ((bool)ViewState["searchListActive"] == true)
        {
            gridView_IndexData.DataSource = (DataSet)ViewState["resultDS"];
        }
        gridView_IndexData.DataBind();
    }

【问题讨论】:

    标签: c# asp.net xml performance dataset


    【解决方案1】:

    1) 如果您将共享相同的数据集实例,则会在并发用户同时搜索时给您错误

    2) 优化搜索速度将您的结构转换为 LINQ 而不是数据集查询

    【讨论】:

      【解决方案2】:

      我会结合使用适当的 xml 处理,例如使用 xmlreader。这是一篇有相关建议的文章 (http://forums.asp.net/t/1939295.aspx?Most+efficient+way+to+iterate+through+XML)。并且,尽可能最大限度地利用缓存。这里有一些关于这方面的建议 (Data Caching in ASP.Net)。

      【讨论】:

      • 谢谢。我在客户端缓存了整个数据集,这使得回发在几秒钟内加载。我还做了其他更改。我创建了 XML Schema,而不是使用数据集的 Select(),而是使用 lambda 表达式来获取主题。这为我的测试中的搜索节省了至少一秒钟,而 XML Schema 确实大大减少了加载时间。取而代之的是 30,页面现在在几秒钟内加载。我给你和沙迪都投了赞成票,但是我的名声很低……
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-30
      • 1970-01-01
      • 2011-08-25
      • 2014-06-02
      • 2011-01-31
      • 2013-05-20
      相关资源
      最近更新 更多