тайм-аут записи данных таблицы с 16k строк в файл - PullRequest
0 голосов
/ 10 октября 2018

У меня есть функция на моем веб-сайте, где администратор может загрузить содержимое таблицы.Таблица имеет около 16ks и только 8 столбцов.

Вот мой код C #

using (MySqlConnection con = new MySqlConnection(constr))
        {

            string query = "SELECT * from wp_portal_users";
            using (MySqlCommand cmd = new MySqlCommand(query))
            {

                cmd.Connection = con;
                con.Open();

                MySqlDataReader sdr = cmd.ExecuteReader();
                DataTable dt = new DataTable();
                if (sdr.HasRows == true)
                {
                    dt.Columns.Add("sysproID");
                    dt.Columns.Add("password");
                    dt.Columns.Add("username");
                    dt.Columns.Add("update_time", typeof(string));
                    dt.Columns.Add("tempPasswordValidity");
                    dt.Columns.Add("tempPassword");
                    dt.Columns.Add("last_login");
                    dt.Columns.Add("login_count");
                    dt.Rows.Add("Syspro ID", "Password", "Username", "Last Updated", "Temp Password Validity", "Temp Password", "Last Login", "Login Count");
                    DataRow dr = null;

                    while (sdr.Read())
                    {
                        dr = dt.NewRow();
                        dr["sysproID"] = sdr["sysproID"].ToString();
                        dr["password"] = sdr["password"].ToString();
                        dr["username"] = sdr["username"].ToString();
                        dr["update_time"] = sdr["update_time"].ToString();
                        dr["tempPasswordValidity"] = sdr["tempPasswordValidity"].ToString();
                        dr["tempPassword"] = sdr["tempPassword"].ToString();
                        dr["last_login"] = sdr["last_login"].ToString();
                        dr["login_count"] = sdr["login_count"].ToString();
                        dt.Rows.Add(dr);
                    }
                }

                string csv = string.Empty;

                foreach (DataRow row in dt.Rows)
                {
                    foreach (DataColumn column in dt.Columns)
                    {
                        //Add the Data rows.
                        csv += row[column.ColumnName].ToString().Replace(",", ";") + ',';
                    }

                    //Add new line.
                    csv += "\r\n";
                }

                //Download the CSV file.
                Response.Clear();
                Response.Buffer = true;
                Response.AddHeader("content-disposition", "attachment;filename=PortalUsers.csv");
                Response.Charset = "";
                Response.ContentType = "application/text";
                Response.Output.Write(csv);
                Response.Flush();
                Response.End();
            }

        }

Когда это выполняется на таблице с несколькими строками, это работает хорошо.С 16k строк это время ожидания.Что я могу изменить, чтобы исправить эту проблему производительности?

1 Ответ

0 голосов
/ 10 октября 2018

Вы не должны создавать данные в памяти только для того, чтобы перебрать строки (а затем выбросить их).Создаваемые таблицы данных довольно медленно создаются.

Вместо этого используйте MySqlDataReader, чтобы добавить строки столбцов в вашу переменную.

Примерно так:

            if (sdr.HasRows == true)
            {
                string csv = string.Empty;

                while (sdr.Read())
                {
                    csv += sdr["sysproID"].ToString().Replace(",", ";") + ',';
                    // add other columns

                    csv += "\r\n";
                }
            }
            //Download the CSV file.

Редактировать :

Как уже упоминалось в комментарии @John, вы должны использовать StringBuilder для сборки CSV:

            if (sdr.HasRows == true)
            {
                StringBuilder sb = new StringBuilder();

                while (sdr.Read())
                {
                    sb.Append(sdr["sysproID"].ToString().Replace(",", ";"));
                    sb.Append(";");
                    // add other columns

                    sb.AppendLine();
                }
            }
            //Download the CSV file.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...