Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
28 / 21 / 8
Регистрация: 05.08.2012
Сообщений: 108

Парсинг большого файла: вопрос оптимизации

12.10.2012, 15:00. Показов 1614. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток.
Есть файл, набитый строками в духе
Code
1
<v>какой-то текст</v>
каким бы образом мне выдрать текст, заключенный к эти теги в массив с минимум вложений памяти? Строк прилично, тысяч под 20. Хотелось бы каждую строчку хранить в виде записи в таблице БД, но там все уже отлажено и работает
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.10.2012, 15:00
Ответы с готовыми решениями:

Парсинг большого количества hex значений из текстового файла
Нужно из текстового файла прочитать кучу hex целочисленных значений от int16 до uint64, а книжку читать не хочется, но если придётся, то...

Парсинг XML-файла. Вопрос оптимизации кода
Добрый вечер, уважаемые форум чане! Передо мной стоит задача, разбить xml на таблицы, в ней храниться информация по клиентам (есть 40...

qt - парсинг большого файла
теперь у меня такая проблема. Имеется txt файл в unicode, в нем 120 000 строк текста вида слово=транскрипция, как бы мне находить...

9
310 / 206 / 44
Регистрация: 15.02.2012
Сообщений: 605
12.10.2012, 15:12
как-то парсил толковый словарь из txt в лоб, 600 тысяч строк, выборка на выходе была где-то 180 тысяч - тупо брал строчку, проверял и засовывал в базу ... отработала минут за 20-30
0
28 / 21 / 8
Регистрация: 05.08.2012
Сообщений: 108
12.10.2012, 15:16  [ТС]
если других вариантов не будет, так и сделаю, куда деваться-то. Но может быть кто подскажет красивое решение
0
 Аватар для nio
6050 / 3460 / 336
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
12.10.2012, 15:53
milssky, у SQLSERVER есть встроенная утилита "Imort And Export Data", там при помощи мастера все делается за пару минут.

если файл вида
<v>какой-то текст</v>
<v>какой-то текст</v>
<v>какой-то текст</v>
(т.е. каждый элемент с новой строки), то обычное считывание массива строк с заменой <v> и </v> на пустую строку


возможно поможет в этом XmlTextReader (мысль вслух, сам ни разу не делал)
1
28 / 21 / 8
Регистрация: 05.08.2012
Сообщений: 108
12.10.2012, 15:58  [ТС]
Цитата Сообщение от nio Посмотреть сообщение
milssky, у SQLSERVER есть встроенная утилита "Imort And Export Data", там при помощи мастера все делается за пару минут.
я sqlite пользую
а вообще да, каждый элемент на своей строке оказывается. это все решает. спасибо
0
 Аватар для Konctantin
970 / 773 / 171
Регистрация: 12.04.2009
Сообщений: 1,700
13.10.2012, 10:05
как-то парсил толковый словарь из txt в лоб, 600 тысяч строк, выборка на выходе была где-то 180 тысяч - тупо брал строчку, проверял и засовывал в базу ... отработала минут за 20-30
это что-то вы перестарались, даже с записью в базу данных.
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
static void Main(string[] args)
{
    var sw = Stopwatch.StartNew();
 
    var rand = new Random();
    var list = new List<string>();
    for (int i = 0; i < 1000000; ++i)
    {
        list.Add(string.Format(@"<v>{0}</v>",
            new string((char)rand.Next(40, 80), rand.Next(20, 200))));
    }
 
    File.WriteAllLines("file.txt", list);
 
    sw.Stop();
    Console.WriteLine("Write : {0}", sw.ElapsedMilliseconds);
            
    sw = Stopwatch.StartNew();
    var context = File.ReadAllLines("file.txt").Select(n => n.Replace(@"<v>", "").Replace(@"</v>", ""));
    sw.Stop();
    Console.WriteLine("Read : {0}", sw.ElapsedMilliseconds);
 
    Console.ReadLine();
}
вот самый примитивный вариант: результат работы < 3 секунд.

Если вы работаете с базой данных, то тут уже надо смотреть на оптимизацию записи/чтения в базу;
1
310 / 206 / 44
Регистрация: 15.02.2012
Сообщений: 605
13.10.2012, 14:31
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
SqlConnection sqlCn = new SqlConnection(@"Data Source=(local)\SQLEXPRESS;Integrated Security=SSPI;Initial Catalog = temp");
sqlCn.Open();
            int wordCount = 0;
            using (StreamReader file = new StreamReader(@"D:\data\efremovaUTF8.txt"))
            {
                do
                {
                    string line = ""; string word = ""; string def = "";
                    word = file.ReadLine();
                    do
                    {
                        line = file.ReadLine();
                        if (line == null) line = "";
                        def += line + Environment.NewLine;
                    } while (line != "");
 
                    wordCount++;
 
                    string sqlCmd = String.Format("Insert Into Words(WordID, Word, Definition) Values ('{0}', '{1}', '{2}')", wordCount, word, def);
                    using (SqlCommand cmd = new SqlCommand(sqlCmd, sqlCn))
                    {
                        cmd.ExecuteNonQuery();
                    }
                } while (!file.EndOfStream);
 
            }
 
            sqlCn.Close();
да вроде не сильно сложнее код ... может у вас компьютер от погодников а может sqlserver дело тормозит
1
28 / 21 / 8
Регистрация: 05.08.2012
Сообщений: 108
13.10.2012, 14:43  [ТС]
Коллеги, в итоге на выспавшуюся голову пришел к решению, похожему на вариант Konctantin. Спасибо за участие
0
 Аватар для Konctantin
970 / 773 / 171
Регистрация: 12.04.2009
Сообщений: 1,700
13.10.2012, 23:27
у вас проблемы с тем, что вы постоянно вызываете команду записи в базу данных, используйте пакетные запросы.
Либо юзайте Prepered Statement

Добавлено через 16 минут
думаю требуется объяснить что и к чему...
Суть в том, что когда вы делаете запрос в базу данных:
C#
1
2
3
4
5
string sqlCmd = String.Format("Insert Into Words(WordID, Word, Definition) Values ('{0}', '{1}', '{2}')", wordCount, word, def);
using (SqlCommand cmd = new SqlCommand(sqlCmd, sqlCn))
{
    cmd.ExecuteNonQuery();
}
sql server должен разобрать и "откомпилировать" запрос, а только потом его выполнить, вот и представите, что вы все время кормите его однородной массой, и каждый раз заставляете его все это перекручивать с нуля.

В случае использования Prepered Statement - создается шаблон запроса, и отправляется на сервер.
Там он 1 раз компилируется и в дальнейшем он только получает параметры - для подстановки в запрос. При этом намного вырастает скорость работы. (записи в базу данных)
1
310 / 206 / 44
Регистрация: 15.02.2012
Сообщений: 605
14.10.2012, 00:27
Интересное замечание, не задумывался об этом. Спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.10.2012, 00:27
Помогаю со студенческими работами здесь

Парсинг большого текстового файла
Приветствую! Вопрос вот в чем - Как открыть файл и прочесть содержимое разделив его на итемы. Пример кода на питоне. file =...

Парсинг большого XML файла
Доброго времени! Имеется очень большой XML из которого нужно вытащить данные. Проблема в том что стандартный парсер TXMLDocument пытается...

Парсинг большого xml
Если есть большой JSON его можно парсить при помощи библиотеки gson, а если есть большой xml как этот https://lenta.ru/rss. Чем его лучше...

Парсинг большого количества страниц
Есть такой вопрос..возможно ли парсить одновременно около 1000 страниц?

Парсинг большого количества страниц
Доброго времени суток, товарищи! Прошу у Вас помощи, самому боюсь не справиться - знаний маловато. Пишу парсер списка ссылок, и...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru