prashant190 Ответов: 0

Исключение нехватки памяти при записи из SQL в csv


У меня есть большая БД ( более 10 м) , если она слишком велика, я получаю исключение из памяти .
Я хотел бы знать, как я могу подтвердить, что сколько строк может поддерживать мое приложение в зависимости от размера оперативной памяти .

Что я уже пробовал:

Я попробовал до 8M строк, и это выглядит хорошо, но помимо этого он выдает исключение из памяти.

Mehdi Gholam

Покажите свой код, его трудно комментировать без контекста (csv-это текстовый файл, и вы можете буферизировать запись в него, а также пакетное чтение из sql), поэтому вы не должны попадать в ограничения памяти.

prashant190

Пожалуйста , найдите фрагмент кода, еще один момент, который я хотел бы упомянуть, это то, что у меня было требование отображать результаты также в сетке, если это необходимо, и colomns должен быть показан на основе конфигурационного файла .
Ниже функция заботится о записи в CSV из DV

  try
            {
                string outputFile =  ConfigurationManager.AppSettings["csvFileName"].ToString();
                outputFile = CSVFilePATH + "\\" + outputFile ;
                if (dataView.RowCount > 0)
                {
                    string value = "";
                    DataGridViewRow dr = new DataGridViewRow();
                    StreamWriter swOut = new StreamWriter(outputFile);

                    //write header rows to csv
                    for (int i = 0; i <= dataView.Columns.Count - 1; i++)
                    {
                        if (!names.Contains(dataView.Columns[i].Name))
                        {
                            if (i > 0)
                            {
                                swOut.Write(",");
                            }
                            swOut.Write(dataView.Columns[i].HeaderText);
                        }
                    }

                    swOut.WriteLine();

                    //write DataGridView rows to csv
                    for (int j = 0; j <= dataView.Rows.Count - 1; j++)
                    {
                        if (j > 0)
                        {
                            swOut.WriteLine();
                        }

                        dr = dataView.Rows[j];

                        for (int i = 0; i <= dataView.Columns.Count - 1; i++)
                        {
                            if (!names.Contains(dataView.Columns[i].Name))
                            {
                                if (i > 0)
                                {
                                    swOut.Write(",");
                                }
                                try
                                {
                                    value = dr.Cells[i].Value.ToString();
                                }
                                catch
                                {
                                    value = "";
                                }
                                //replace comma's with spaces
                                value = value.Replace(',', ' ');
                                //replace embedded newlines with spaces
                                value = value.Replace(Environment.NewLine, " ");

                                swOut.Write(value);
                            }
                            
                        }
                        lblMessage.Text = "Downloaded file " + outputFile + " Successfully...";
                    }
                    swOut.Close();
                   // dataView.Visible = false;
                }
            }
            catch (Exception exp)
            {
                
                Logger.Info("Exception during File Export..\r\n" + exp.Message.ToString());
            }

Richard MacCutchan

Вы не можете загрузить все данные в память сразу. Считывайте только те строки, которые вам нужны для каждого запроса.

0 Ответов