Как я могу прочитать большой файл с диска в базу данных без нехватки памяти

Мне стыдно задавать этот вопрос, так как я чувствую, что уже должен знать. Однако, учитывая, что я не ... Я хочу знать, как читать большие файлы с диска в базу данных, не получая исключение OutOfMemory. В частности, мне нужно загрузить CSV (или действительно файлы с разделителями табуляции).

Я экспериментирую сCSVReader и конкретноэтот пример кода но я уверен, что я делаю это неправильно. Некоторые из ихдругие примеры кодирования показать, как вы можете читать потоковые файлыЛюбые размер, который в значительной степени то, что я хочу (только мне нужно прочитать с диска), но я не знаю, какой типIDataReader Я мог бы создать, чтобы позволить это.

Я читаю прямо с диска, и моя попытка гарантировать, что у меня никогда не кончится память, читая слишком много данных сразу, приведена ниже. Я не могу не думать, что я должен быть в состоянии использоватьBufferedFileReader или что-то подобное, где я могу указать на местоположение файла и указать размер буфера, а затемCsvDataReader ожидаетIDataReader поскольку это первый параметр, он может просто использовать это. Пожалуйста, покажи мне ошибку моих путей, позволь мне избавиться от моегоGetData метод с его произвольным механизмом разбиения файлов и помогите мне с этой основной проблемой.

    private void button3_Click(object sender, EventArgs e)
    {   
        totalNumberOfLinesInFile = GetNumberOfRecordsInFile();
        totalNumberOfLinesProcessed = 0; 

        while (totalNumberOfLinesProcessed < totalNumberOfLinesInFile)
        {
            TextReader tr = GetData();
            using (CsvDataReader csvData = new CsvDataReader(tr, '\t'))
            {
                csvData.Settings.HasHeaders = false;
                csvData.Settings.SkipEmptyRecords = true;
                csvData.Settings.TrimWhitespace = true;

                for (int i = 0; i < 30; i++) // known number of columns for testing purposes
                {
                    csvData.Columns.Add("varchar");
                }

                using (SqlBulkCopy bulkCopy = new SqlBulkCopy(@"Data Source=XPDEVVM\XPDEV;Initial Catalog=MyTest;Integrated Security=SSPI;"))
                {
                    bulkCopy.DestinationTableName = "work.test";

                    for (int i = 0; i < 30; i++)
                    {
                        bulkCopy.ColumnMappings.Add(i, i); // map First to first_name
                    }

                    bulkCopy.WriteToServer(csvData);

                }
            }
        }
    }

    private TextReader GetData()
    {
        StringBuilder result = new StringBuilder();
        int totalDataLines = 0;
        using (FileStream fs = new FileStream(pathToFile, FileMode.Open, System.IO.FileAccess.Read, FileShare.ReadWrite))
        {
            using (StreamReader sr = new StreamReader(fs))
            {
                string line = string.Empty;
                while ((line = sr.ReadLine()) != null)
                {
                    if (line.StartsWith("D\t"))
                    {
                        totalDataLines++;
                        if (totalDataLines < 100000) // Arbitrary method of restricting how much data is read at once.
                        {
                            result.AppendLine(line);
                        }
                    }
                }
            }
        }
        totalNumberOfLinesProcessed += totalDataLines;
        return new StringReader(result.ToString());
    }

Ответы на вопрос(6)

Ваш ответ на вопрос