Форум программистов, компьютерный форум, киберфорум
C#: Базы данных, ADO.NET
Войти
Регистрация
Восстановить пароль
Другие темы раздела
C# Npgsql.npgsqlexception: INSERT содержит больше выражений, чем целевых колонок https://www.cyberforum.ru/ ado-net/ thread1360774.html
Есть аддон под кад систему, который получает габариты детали и дальше должен записать габариты детали в БД. //метод записи в бд. private void AddtoDb(double coords,string folder,string name) ...
C# Выборка строк таблицы с возвратом в собственную MDI-форму
Приветствую. Есть приложение с MDI формами и база *.accdb, а также пара кнопок. Так как я в Visual C# полный новичок, мне необходима ваша помощь. Необходимо, чтобы по клику создавалась MDI форма с...
Как в SharpDevelop подключить SQLite? C#
Всем привет. Подскажите, пожалуйста, как в SharpDevelop подключить SQLite? Желательно подробно или литературу на подключение. Не могу разобраться.
C# Перебор значений в таблице и сравнение с другой Здравствуйте. Нужна помощь. есть таблица в БД Oracle tabl с полями dat, otpravitel, poluchatel, jurnal и есть таблица tabl2 с полями dat, otpravitel и polucjatel, jurna причем dat имеет формат... https://www.cyberforum.ru/ ado-net/ thread1360315.html
C# База данных в интернете https://www.cyberforum.ru/ ado-net/ thread1360236.html
Всем привет, подскажите пожалуйста как создать базу данных в интернете, что бы к нему имели доступ сразу несколько пользователей . И как установит связь с ним в приложениях c#. При много...
Работа с БД (проверка структуры) C#
Суть в том, что ENtityFramework может сверять структуру бд, с той что у него в xml-ках(db.Database.CompatibleWithModel(false)), есть ли что-то подобное без EF, реализованное уже? Или придется писать...
C# Составление запроса ORDER BY CHAR_LENGHT
Не могу составить запрос правильно, проблема в синтаксисе. Help me please)) List<Form1.Brand> Brands = new List<Form1.Brand>(); string query = "SELECT BrandName, Logo, Description...
C# Выборка из нескольких таблиц Здравствуйте! Столкнулся с непониманием, как составить запрос для выборки данных из нескольких таблиц. Имеется 6 таблиц Student, status, spetial, falultet, departament, course. В таблицу student... https://www.cyberforum.ru/ ado-net/ thread1360195.html
C# Синхронизация баз данных https://www.cyberforum.ru/ ado-net/ thread1360119.html
Вводная. Есть программа, использующая базу данных Access. Программой пользуются 3 человека - 2 оператора и начальник. Во всех случаях база данных хранится локально, каждый человек работает за...
C# Создание таблиц бд Доброго времени суток ! Вопрос такой у меня есть таблица со странами (имя и id) Мне нужно создать таблицу которая будет включать в себя несколько стран, то есть создавать пачки из стран. После... https://www.cyberforum.ru/ ado-net/ thread1359942.html
0 / 0 / 0
Регистрация: 24.01.2015
Сообщений: 13
0

Вставка большого объема информации в базу данных MySQL

24.01.2015, 16:50. Просмотров 1461. Ответов 8
Метки (Все метки)

Добрый день!!!

Друзья помогите разобраться, я написал программу сам, но не очень разбираюсь и не совсем понимаю правильно ли она работает...

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

Моя задача такова, взять большой файл:
C#
1
2
3
4
5
6
7
8
9
        public static IEnumerable read_file;
        public static IEnumerator line_list;
 
        public static Queue<Exception> exceptions = new Queue<Exception>();
 
        // ....
 
        read_file = File.ReadLines(file_name);
        line_list = read_file.GetEnumerator();
(пример содержания файла)
1
2
3
4
a
b
c
d
e
f
// допустим 150 000 000 строк

Разные переменные

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
        public static int str_file_count, insert_count;
 
        public static int str_count; 
 
        public static string current_table; // текущая таблица
 
        // вывод на экран определяется случайно функцией Rand (от, до)
        public static int min; // минимальное кол-во. записей 
        public static int max;  // максимальное кол-во. записей
 
        public static string file_name, file_line, md5_file_line;
 
        public static int rand;
 
        public static bool pause_query;
Random
C#
1
2
3
4
5
6
7
8
9
10
        public static readonly Random getrandom = new Random();
        public static readonly object syncLock = new object();
 
        public static int GetRandomNumber(int min, int max)
        {
            lock (syncLock)
            {
                return getrandom.Next(min, max);
            }
        }
Далее запустить цикл в отдельном потоке


C#
1
2
3
4
               
 
        Thread thread = new Thread(MySQL_insert_method);
        thread.Start();
В цикле нужно брать каждую строку формировать для нее MD5 хеш ЗАТЕМ брать первые 2 символа хеша от строки и делать INSERT в базу данных MySQL например базу данных test, в таблицу MD5[первые два символа строки]

Пример Таблица MD503 хеш 031c3b4d65501a9a3aa8c9b37af442 bf = 000313

В итоге мы имеем 256 таблиц MD5

Вот код моего цикла

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
        private void MySQL_insert_method()
        {
            while (true)
            {
                try
                {
                    lock (line_list)
                    {
                        if (line_list.MoveNext())
                        {
                            file_line = line_list.Current as string;
                        }
                        else
                        {
                            Settings.mysql_connect.Close();
                            Console.ReadLine();
                            break;
                        }
                    }
 
                    md5_file_line = StringHash.GetMD5Hash(MySqlHelper.EscapeString(file_line));
                    current_table = md5_file_line.Substring(0, 2);
 
                    try
                    {
                        if (pause_query == false)
                        {
 
                            Query.Insert("MD5" + current_table, file_line, md5_file_line);
 
                            insert_count++;
                            str_count++;
 
                            if (str_count > rand)
                            {
                                ConsoleWrite("[+] STR: " + md5_file_line + ":" + file_line, 7, 0);
                                ConsoleWrite("[+] INSERTED STRING TO: [MD5" + current_table + "] [COUNT: " + insert_count + "]", 9, 0);
 
                                str_count = 0;
                            }
                        }
                    }
                    catch (Exception exceptions)
                    {
                        StreamWriter WriteErrorlog = new StreamWriter("log\\" + DateTime.Now.ToString(@"MM\.dd\.yyyy") + "\\error.log", true);
                        WriteErrorlog.Write(DateTime.Now.ToString("HH:mm:ss") + ": [-] " + exceptions + "\r\n");
                        WriteErrorlog.Close();
                        break;
                    }
                }
                catch (ThreadAbortException)
                {
                    break;
                }
                catch (Exception exceptions)
                {
                    StreamWriter WriteErrorlog = new StreamWriter("log\\" + DateTime.Now.ToString(@"MM\.dd\.yyyy") + "\\error.log", true);
                    WriteErrorlog.Write(DateTime.Now.ToString("HH:mm:ss") + ": [-] " + exceptions + "\r\n");
                    WriteErrorlog.Close();
                    break;
                }
            }
        }
Как можно оптимизировать, ускорить код?) рассмотри все предложения
LOAD DATA IN FILE не предлагать использовать в место INSERT
Я бы рассмотрел примерчик групповой вставки INSERT так как не знаю как это сделать я просто не представляю даже...

Запрос в базу
C#
1
2
3
4
5
6
7
        public static void Insert(string table, string colum1, string colum2)
        {
            int sql_query_execute;
 
            MySqlCommand insert_command = new MySqlCommand("insert ignore into " + table + " (text, md5hash) values ('" + MySqlHelper.EscapeString(colum1) + "', '" + colum2 + "')", Settings.mysql_connect);
            sql_query_execute = insert_command.ExecuteNonQuery();
        }

Генератор MD5

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    public static class StringHash
    {
        static readonly char[] HexChars = new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
        static readonly MD5 md5 = MD5.Create();
        static readonly Encoding UTF8 = Encoding.UTF8;
 
        static public string GetMD5Hash(string S)
        {
            byte[] B = md5.ComputeHash(UTF8.GetBytes(S));
            char[] ar = new char[B.Length * 2];
 
            int Index = 0;
            foreach (byte bv in B)
            {
                ar[Index++] = HexChars[bv >> 4];
                ar[Index++] = HexChars[bv & 0xF];
            }
 
            return new string(ar);
        }
    }


Вернуться к обсуждению:
Вставка большого объема информации в базу данных MySQL
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.01.2015, 16:50
Готовые ответы и решения:

Добавление большого объема данных в mysql
Здравствуйте! Мне нужно добавить большой объем текста в mysql через обычное поле input типа file в...

Скажется ли на производительности загрузка большого объема данных из БД MySQL в DGV
Добрый вечер, господа. Ситуация следующая: есть datagridview, отображающая данные, и бд mysql,...

Вставка большого объема текста
Стоит задача вставить большое кол-во текста на форму(8 страниц a4). Причем в тексте есть еще...

Вставка записи в базу данных. MySQL
Есть база данных, в которой есть таблицы categories, которая имеет структуру(см. Рис.1) и таблица...

8
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.