Может ли программа на C # прочитать текстовый файл в память и затем передать этот объект методу, который требует имя файла? - PullRequest
2 голосов
/ 10 июня 2011

В программе на C # я импортирую большой текстовый файл (300 МБ) в базу данных MySQL через функцию MySqlBulkLoader MySql .Net Connector.

Импорт занимает довольно много времени и приводит к почти 100% использования диска на сервере Windows 2003, на котором он запущен.Пытаясь ускорить импорт, программа теперь разбивает большой файл на более мелкие куски.

Можно ли считать небольшой файл (8 МБ) в память (т. Е. Массив), а затем передать его вMySQLBulkLoader как файл?

Навальный загрузчик ищет путь к имени файла:

 MySql.Data.MySqlClient.MySqlBulkLoader myBulk = new MySql.Data.MySqlClient.MySqlBulkLoader(connection);                
 myBulk.Timeout = 10 * 60; /
 myBulk.TableName = "some_table";                
 myBulk.Local = true;
 myBulk.LineTerminator = @"\n";
 myBulk.FileName = aFile.FullName;
 myBulk.FieldTerminator = "";

Ответы [ 2 ]

1 голос
/ 03 ноября 2016

Следующий класс признает, что это невозможно, и записывает DataTable на диск перед массовой загрузкой.

Возможно, он не подходит для всех обстоятельств, но в то время соответствовал моим потребностям.

using MySql.Data.MySqlClient;
using System.Data;
using System.IO;
using System.Text;

namespace ImportDatabase
{
    class DataTableToMySql
    {
        public MySqlConnection Connection { get; set; } 
        public DataTable SourceDataTable { get; set; } 
        public string FieldTerminator { get; set; }
        public string LineTerminator { get; set; }

        public DataTableToMySql(MySqlConnection conn, DataTable table)
        {
            FieldTerminator = "\t";
            LineTerminator = "\n";

            Connection = conn;
            SourceDataTable = table;
        }

        public void Execute()
        {
            string fileName = Path.GetTempFileName();

            try
            {
                byte[] fieldTerm = Encoding.UTF8.GetBytes(FieldTerminator);

                byte[] lineTerm = Encoding.UTF8.GetBytes(LineTerminator);

                PrepareFile(fileName, fieldTerm, lineTerm);

                LoadData(fileName);
            }
            finally
            {
                File.Delete(fileName);
            }
        }

        private void LoadData(string fileName)
        {
            MySqlBulkLoader bl = new MySqlBulkLoader(Connection);

            bl.FieldTerminator = FieldTerminator;

            bl.LineTerminator = LineTerminator;

            bl.TableName = SourceDataTable.TableName;

            bl.FileName = fileName;

            bl.Load();
        }

        private void PrepareFile(string fileName, byte[] fieldTerm, byte[] lineTerm)
        {
            using (FileStream fs = new FileStream(fileName, FileMode.Append))
            {
                foreach (DataRow row in SourceDataTable.Rows)
                { 
                    int i = 0;

                    foreach (object val in row.ItemArray)
                    {
                        byte[] bytes;

                        if (val is DateTime)
                        {
                            DateTime theDate = (DateTime)val;
                            string dateStr = theDate.ToString("yyyy-MM-dd HH:mm:ss"); 
                            bytes = Encoding.UTF8.GetBytes(dateStr);
                        }
                        else
                            bytes = Encoding.UTF8.GetBytes(val.ToString());

                        fs.Write(bytes, 0, bytes.Length);

                        i++;

                        if (i < row.ItemArray.Length)
                            fs.Write(fieldTerm, 0, fieldTerm.Length);
                    }

                    fs.Write(lineTerm, 0, lineTerm.Length);
                }
            }
        }
    }
}
1 голос
/ 10 июня 2011

Память не файл, поэтому короткий ответ - нет. Альтернативы:

  1. Прочитать файл, записать его как временный файл (System.IO.Path.GetTempFileName() здесь ваш друг, имя которого дает частичный файл) и передать это имя файла MySqlBulkLoader
  2. Используйте инструмент «RAM Disk» для создания диска на основе памяти, чтобы поместить копию полного файла размером 300 МБ, а затем передать путь к этим файлам в MySqlBulkLoader.
...