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

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

24.01.2015, 16:50. Просмотров 973. Ответов 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 хеш 031c3b4d65501a9a3aa8c9b37af442bf = 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.01.2015, 16:50
Ответы с готовыми решениями:

Какой лучший способ хранения большого объема данных?
Доброй ночи :) Требуется простой совет, каким образом лучше всего хранить...

Вставка картинки в базу MySQL
имеется база в MySQl... в ней есть столбец с форматом mediumblob . нужно две...

Вставка большого количества данных
Добрый день. Не подскажете, кто какими способами заносит данные в базу MS...

Подключение и вставка в базу данных
Что здесь не правильно? Не происходит вставка в БД. Подскажите)using System;...

Вставка картинки в базу данных через C#
Какой фуекцией можно реализовать вставку(загрузку из папки) картинку в таблицу...

8
REALIST07
Автор FAQ
Автор FAQ
195 / 194 / 21
Регистрация: 11.06.2010
Сообщений: 1,015
24.01.2015, 17:20 2
Первое что приходит в голову и проще всего реализуемое:
1)разделить на 2 части текст в файле;
2)найти примерную середину и считывать сверху вниз и снизу вверх.
Если количество строк было 150 000 000,то статичная переменная будет равно 75 000 000,уже много меньше,в любом случае надо разбивать на части текст.
0
zer0day
0 / 0 / 0
Регистрация: 24.01.2015
Сообщений: 13
24.01.2015, 17:28  [ТС] 3
Проблем с большим файлом нету хоть 999999999999999 строк там будет проблема мне кажется где то в цикле... как то у меня все сложно сделано можно проще наверно
0
insite2012
Модератор
Эксперт .NET
4873 / 3826 / 1096
Регистрация: 12.10.2013
Сообщений: 11,100
Записей в блоге: 2
24.01.2015, 19:50 4
Цитата Сообщение от REALIST07 Посмотреть сообщение
Первое что приходит в голову
1. Использовать параллельное выполнение, таким образом мы ускорим обработку всех данных.
2. Не записывать таблицы постепенно, а формировать в памяти один DataSet с коллекцией DataTable-ов, а потом одним оператором все это записать в DataBase.
ТС, давайте пример файла, попробую что-то придумать. Самому выдумывать такой файл лень, по правде говоря...
0
zer0day
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 просмотров)
insite2012
Модератор
Эксперт .NET
4873 / 3826 / 1096
Регистрация: 12.10.2013
Сообщений: 11,100
Записей в блоге: 2
24.01.2015, 22:46 6
Цитата Сообщение от zer0day Посмотреть сообщение
нужно брать каждую строку формировать для нее MD5 хеш ЗАТЕМ брать первые 2 символа хеша от строки и делать INSERT в базу данных MySQL например базу данных test, в таблицу MD5[первые два символа строки]
Цитата Сообщение от zer0day Посмотреть сообщение
В итоге мы имеем 256 таблиц MD5
Разъясните мне, как первая цитата согласуется со второй. По первой выходит, что для каждого хеша (который создается из строки, коих over 100500) создается своя таблица.
А во второй цитате говорится, что таблиц всего 256.
И да, я не просил ваш проект, мне нужен сам источник, тот текстовый файл с over 100500 строками.
0
zer0day
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 - cb0c8f5de2f4fa75e4d813edb3f1ac77 он отправляется в таблицу md5c

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

так легче MySQL переносить "тяжести" и мне легче не использовать индексы, а потом просто сортировать от повторов.
0
Вложения
Тип файла: zip file.zip (25.4 Кб, 2 просмотров)
Metall_Version
2120 / 1257 / 516
Регистрация: 04.03.2014
Сообщений: 4,092
Завершенные тесты: 2
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
zer0day
0 / 0 / 0
Регистрация: 24.01.2015
Сообщений: 13
25.01.2015, 18:55  [ТС] 9
Metall_Version, то есть с кодом у меня все в порядке?)

Добавлено через 2 часа 17 минут
insite2012, Будьте добры удалите тему.
0
25.01.2015, 18:55
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.01.2015, 18:55

Вставка картинок в базу данных MS SQL
Здравствуйте. Мне нужно вставить картинки в базу данных MS SQL. Я сделал так,...

Сохранение информации в базу данных
Создаю бд в wpf С# Нужно чтобы в texbox пользователь вводил информацию о себе и...

Вставка decimal в базу данных SQL server из maskedTextBox
Уважаемые форумчане! Помогите разобраться. Уже третий день пытаюсь внести...


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

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

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