Форум программистов, компьютерный форум, киберфорум
C#: Базы данных, ADO.NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
0 / 0 / 0
Регистрация: 24.01.2015
Сообщений: 13
1

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

24.01.2015, 16:50. Просмотров 1459. Ответов 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);
        }
    }
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
Автор FAQ
Автор FAQ
199 / 198 / 21
Регистрация: 11.06.2010
Сообщений: 1,024
24.01.2015, 17:20 2
Первое что приходит в голову и проще всего реализуемое:
1)разделить на 2 части текст в файле;
2)найти примерную середину и считывать сверху вниз и снизу вверх.
Если количество строк было 150 000 000,то статичная переменная будет равно 75 000 000,уже много меньше,в любом случае надо разбивать на части текст.
0
0 / 0 / 0
Регистрация: 24.01.2015
Сообщений: 13
24.01.2015, 17:28  [ТС] 3
Проблем с большим файлом нету хоть 999999999999999 строк там будет проблема мне кажется где то в цикле... как то у меня все сложно сделано можно проще наверно
0
Модератор
Эксперт .NET
5074 / 3983 / 1145
Регистрация: 12.10.2013
Сообщений: 11,582
Записей в блоге: 2
24.01.2015, 19:50 4
Цитата Сообщение от REALIST07 Посмотреть сообщение
Первое что приходит в голову
1. Использовать параллельное выполнение, таким образом мы ускорим обработку всех данных.
2. Не записывать таблицы постепенно, а формировать в памяти один DataSet с коллекцией DataTable-ов, а потом одним оператором все это записать в DataBase.
ТС, давайте пример файла, попробую что-то придумать. Самому выдумывать такой файл лень, по правде говоря...
0
0 / 0 / 0
Регистрация: 24.01.2015
Сообщений: 13
24.01.2015, 22:08  [ТС] 5
insite2012, вот
в архиве 2 проэкта, для создания 256 таблиц и сама программа база нужна с названием MD5
нужно просто скомпилировать и запустить, там будет говнофункция установки соединения с базой

Базу данных использовал mysql-5.6.19-winx64

myisam
0
Вложения
Тип файла: zip Для cyberforum.zip (856.6 Кб, 2 просмотров)
Модератор
Эксперт .NET
5074 / 3983 / 1145
Регистрация: 12.10.2013
Сообщений: 11,582
Записей в блоге: 2
24.01.2015, 22:46 6
Цитата Сообщение от zer0day Посмотреть сообщение
нужно брать каждую строку формировать для нее MD5 хеш ЗАТЕМ брать первые 2 символа хеша от строки и делать INSERT в базу данных MySQL например базу данных test, в таблицу MD5[первые два символа строки]
Цитата Сообщение от zer0day Посмотреть сообщение
В итоге мы имеем 256 таблиц MD5
Разъясните мне, как первая цитата согласуется со второй. По первой выходит, что для каждого хеша (который создается из строки, коих over 100500) создается своя таблица.
А во второй цитате говорится, что таблиц всего 256.
И да, я не просил ваш проект, мне нужен сам источник, тот текстовый файл с over 100500 строками.
0
0 / 0 / 0
Регистрация: 24.01.2015
Сообщений: 13
25.01.2015, 11:35  [ТС] 7
insite2012,

зачем вам простой текстовый файл? там содержание ну просто строки

строка1
строка2
строка3

от 1 до 15 символов

Разъясните мне, как первая цитата согласуется со второй. По первой выходит, что для каждого хеша (который создается из строки, коих over 100500) создается своя таблица.
А во второй цитате говорится, что таблиц всего 256.
MD5 - 0123456789abcdef - 16 символов любой md5 хеш состоит только из этих 16 символов и длинна его 32 символа нижнего регистра создаем таблицы

md50
md51
md52
md53
md54
md55
md56
md57
md58
md59
md5a
md5b
md5c
md5d
md5e
md5f
программа определяет в какую таблицу вставлять строку с хешем MD5

то есть берем слово строка1 его MD5 - cb0c8f5de2f4fa75e4d813edb3f1ac 77 он отправляется в таблицу md5c

а у меня 256 таблиц я взял не первый символ, а первые два символа то есть 2^8=256

так легче MySQL переносить "тяжести" и мне легче не использовать индексы, а потом просто сортировать от повторов.
0
Вложения
Тип файла: zip file.zip (25.4 Кб, 2 просмотров)
2132 / 1269 / 516
Регистрация: 04.03.2014
Сообщений: 4,092
25.01.2015, 11:56 8
zer0day, скорость в данном случае это проблема субд, а программы
нужно использовать bulkcopy (bulkinsert)
http://blogs.msdn.com/b/nikhilsi/arc...rom-c-app.aspx
http://social.technet.microsoft.com/...e-using-c.aspx
0
0 / 0 / 0
Регистрация: 24.01.2015
Сообщений: 13
25.01.2015, 18:55  [ТС] 9
Metall_Version, то есть с кодом у меня все в порядке?)

Добавлено через 2 часа 17 минут
insite2012, Будьте добры удалите тему.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.01.2015, 18:55

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Выгрузка из БД большого объема информации
Всем привет. По сути дела сейчас делаю некий журнал активности для личного кабинета ... ...

Импорт большого объема информации из txt файла
Добрый день, уважаемые форумчане! В общем дело обстоит так. Имеется txt фаил с более чем 24000...

зависания при записи большого объема информации на хард
Жёсткий диск WDC WD15EARS-00MVWB0 ATA Device Windows 7 x64 зависает при...

Какой компонент подойдет для ввода текстовой информации (большого объема)?
Здравствуйте! Подскажите, какой взять компонент для ввода текстовой информации (большого объема) ?

Постраничное разбиение большого объема текста PHP+MYSQL
Доброго времени суток. В БД хранится множество статей разного объема. При просмотре любая статья...

Экспорт данных большого объёма
Есть дамп таблицы размером примерно 500 мегабайт. Пытаюсь залить его с помощью phpMyAdmin. Нажимаю...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

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