|
строка в массив | ☑ | ||
---|---|---|---|---|
0
zdas
29.11.12
✎
16:34
|
Добрый день всем. Поиском искал, но что-то все упирается в "Недостаточно памяти". На Сервере 1с - 60 гигов оперативы.
Задача - распарсить как можно быстрее файл >3 500 000 строк в массив. Пока кроме перебора ничего не работает:( |
|||
1
Нуф-Нуф
29.11.12
✎
16:35
|
что за файл?
|
|||
2
zdas
29.11.12
✎
16:36
|
что-то типа мониторинга состояний(текстовые строки с разделителем ";" и в конце перенос каретки).
|
|||
3
Нуф-Нуф
29.11.12
✎
16:38
|
||||
4
zdas
29.11.12
✎
16:39
|
(3) спс. щас проверю:)
|
|||
5
Heckfy
29.11.12
✎
16:39
|
Не используй ТекстовыйДокумент, а используй ЧтениеТекста
|
|||
6
zdas
29.11.12
✎
16:44
|
(5)
текст в переменную МойТекст записывается нормально. ТД = Новый ТекстовыйДокумент(); ТД.Прочитать(ИмяФайла,КодировкаТекста.UTF8); Сообщить("Загрузка из файла."); МойТекст = ТД.ПолучитьТекст(); (3) тестирую |
|||
7
YF
29.11.12
✎
16:46
|
хочешь массив из > 3 500 000 элементов, каждый из которых целая строка исходного файла?
|
|||
8
sapphire
29.11.12
✎
16:47
|
ЧтениеТекста (TextReader)
Методы: Закрыть (Close) Открыть (Open) Прочитать (Read) ПрочитатьСтроку (ReadLine) Конструкторы: По имени файла Формирование неинициализированного объекта Описание: Предназначен для последовательного чтения текстовых файлов (большой длины). Доступность: Тонкий клиент, сервер, толстый клиент, внешнее соединение. Пример: Текст = Новый ЧтениеТекста("d:\win.txt", КодировкаТекста.ANSI); Стр = Текст.ПрочитатьСтроку(); Пока Стр <> Неопределено Цикл // строки читаются до символа перевода строки Сообщить(Стр); Стр = Текст.ПрочитатьСтроку(); КонецЦикла; |
|||
9
zdas
29.11.12
✎
16:48
|
(7) да. много хочу?
(3) Объект 'light_.log' не найден ядром базы данных Microsoft Jet. Проверьте существование объекта и правильность имени и пути. Передаю путь и имя файла - корректные. |
|||
10
Heckfy
29.11.12
✎
16:51
|
(6) Сделай (8), будет тебе счастье. 60 гигов массив из такого количества выдержит.
|
|||
11
zdas
29.11.12
✎
16:52
|
(10) сделал, грузит на секунду меньше.
вопрос не в том, мне "это" потом надо в массив преобразовать без перебора (перебор долгий очень) |
|||
12
sapphire
29.11.12
✎
16:56
|
О.. могу ЧЖА-метод предложить автору :)
|
|||
13
zulu_mix
29.11.12
✎
16:57
|
загоняй в скуль через bulk insert и в скуле уже делай с данными что хошь
|
|||
14
Мыш
29.11.12
✎
16:57
|
Средствами 1С такие файлы парсить весьма проблематично.
|
|||
15
zulu_mix
29.11.12
✎
16:59
|
+(13) и покури COMSafeArray
|
|||
16
zdas
29.11.12
✎
16:59
|
(12) мне уж пофиг что пробовать с этим файлом :)
(13) загнать в массив это еще полбеды:) |
|||
17
sapphire
29.11.12
✎
16:59
|
(13) У дураков мысли сходятся, но я знаю как из BULK получить сразу массив... огромный такой массивище :))))
|
|||
18
sapphire
29.11.12
✎
17:00
|
(16) И что же с этой страстью еще потом делать? :)
|
|||
19
zdas
29.11.12
✎
17:04
|
(18) в каждой строке - есть ИД, вот по нему надо найти минимум и максимум.
Наверное в скуль и прийдется грузить, а оттуда уже запросами. |
|||
20
Мыш
29.11.12
✎
17:04
|
(16) Да, тоже интересно, что будет дальше с массивом )
|
|||
21
Мыш
29.11.12
✎
17:06
|
(19) И сколько примерно возможных значений идентификатора в файле?
|
|||
22
zdas
29.11.12
✎
17:07
|
(21) файл весом 250-300 мегов, уникальных ИД от 6000 до 25000
|
|||
23
Мыш
29.11.12
✎
17:08
|
(22) Задача решается последовательным чтением. Полностью в память массив грузить НЕ надо. В скуль тем более.
|
|||
24
m-serg74
29.11.12
✎
17:09
|
(22) а после того как найдешь максимум и минимум, что с данными то надо делать?
|
|||
25
zdas
29.11.12
✎
17:12
|
(24) вывести в документ
|
|||
26
m-serg74
29.11.12
✎
17:14
|
так оп мере чтения из файло и формируй если максимумов/минимумов несколько может быть тогда два массива - Макс и Мин, а если это всего два значения тогда просто в переменную запоминай на фига 3500000 значений грузить в массив чтоб потом
МойМассив = Неопределено; сделать |
|||
27
zulu_mix
29.11.12
✎
17:15
|
(25) рукалицо если честно
|
|||
28
Мыш
29.11.12
✎
17:17
|
(27) И не говори )
|
|||
29
regniws
29.11.12
✎
17:17
|
а чо, внешние исчтоники данных для кого писали!?
|
|||
30
zdas
29.11.12
✎
17:18
|
(27) поэтому и написал на форум:(
|
|||
31
Адинэснег
29.11.12
✎
17:22
|
вот что случается, когда бухгалтер по образованию становится программистом...
|
|||
32
Адинэснег
29.11.12
✎
17:23
|
тут 60 Гб оперативы не справятся :-D
|
|||
33
Heckfy
29.11.12
✎
17:24
|
(30) А у тебя сейчас за какое время выполняется?
|
|||
34
zulu_mix
29.11.12
✎
17:24
|
откуда такой файл получается? может проще в ту систему запрос сделать или хранимую процедуру туда приспособить?
|
|||
35
zdas
29.11.12
✎
17:25
|
(31,32) любитель офф?
(33) по-разному:( но этот файл вообще не грузиться. бывает 200 проскакивает за 30 минут |
|||
36
zdas
29.11.12
✎
17:25
|
(34) нее. там робот тупо логи пишет по текущему состоянию. думл уже об этом.
|
|||
37
zulu_mix
29.11.12
✎
17:26
|
(36) так пусть он тупо пописывает еще и в скуль
|
|||
38
Адинэснег
29.11.12
✎
17:27
|
шо за прога?
|
|||
39
zdas
29.11.12
✎
17:28
|
(37) у меня места столько нет на жестком под эту базу:), таких файлов может быть 2-3 в день. а бывает что иногда перегружают по нескольку раз один файл (типа коэффициенты и прочие условия наложения на каждую строку). вообщем сложный подход через рукалицо)
(38) самописка на дотнете (C#) |
|||
40
zdas
29.11.12
✎
17:29
|
+39 некоторые логи вообще не нужны
|
|||
41
Eugene_life
29.11.12
✎
17:30
|
(39) Так допили самописку, чтобы сама выдавала минимумы и максимумы в он-лайне
|
|||
42
Heckfy
29.11.12
✎
17:30
|
(35) Странно как то.... Затестил:
Процедура КнопкаСформироватьНажатие(Кнопка) Сч=0; Сообщить("Начало: "+ТекущаяДата()); Текст = Новый ЧтениеТекста("D:\Temp\111.txt", КодировкаТекста.ANSI); Стр = Текст.ПрочитатьСтроку(); Массив=Новый Массив; Пока Стр <> Неопределено Цикл Стр = Текст.ПрочитатьСтроку(); Массив.Добавить(Стр); Сч=Сч+1; Если Сч%50000=0 Тогда Состояние(""+Сч); КонецЕсли; КонецЦикла; Сообщить("Окончание: "+ТекущаяДата()+" Обработано: "+Сч+" строк"); КонецПроцедуры Получилось: Начало: 29.11.2012 17:27:24 Окончание: 29.11.2012 17:28:05 Обработано: 3 000 000 строк |
|||
43
zulu_mix
29.11.12
✎
17:30
|
тогда пробуй это безобразие в кашэ влупить
|
|||
44
zdas
29.11.12
✎
17:32
|
(42) не не не:) я его хотел сразу из файла в массив вывалить, без построчного чтения:)
(43) а можно ссылкой кинуть что почитать на эту тему? |
|||
45
zdas
29.11.12
✎
17:34
|
(42) размер файла какой? у меня строка в среднем где-то 30-40 символов каждая в этом файле.
|
|||
46
zulu_mix
29.11.12
✎
17:34
|
||||
47
zdas
29.11.12
✎
17:36
|
спс, ща гляну:)
|
|||
48
Heckfy
29.11.12
✎
17:37
|
(45) 385254 КБ
В нем строки вида(матофильтр не пропускает): От балды набираем на клавиатуре. Длина строки 130/131 символ. Количество строк 3 млн. Чем тебе 30 секунд перебором не устраивает? |
|||
49
Heckfy
29.11.12
✎
17:37
|
Вру, 40 секунд :)
|
|||
50
hhhh
29.11.12
✎
17:39
|
(45) вообще-то перебор - это самое быстрое. Думаешь в остальных методах оно тебе из воздуха будет строчки со скоростью света засасывать?
|
|||
51
zdas
29.11.12
✎
17:41
|
(49) ща скажу сколько у меня перебирается:)
(50) готовые методмы (типа Найти у массивов/тз) быстрее чем перебор на языке 1с:) |
|||
52
zdas
29.11.12
✎
17:41
|
*методмы = методы
|
|||
53
Heckfy
29.11.12
✎
17:44
|
(51) Так будет правильнее:
Пока Стр <> Неопределено Цикл Массив.Добавить(Стр); Сч=Сч+1; Стр = Текст.ПрочитатьСтроку(); Если Сч%50000=0 Тогда Состояние(""+Сч); КонецЕсли; КонецЦикла; |
|||
54
zdas
29.11.12
✎
17:50
|
(53) перебор: 82 секунды, в массиве: 3 634 746 элементов
|
|||
55
Heckfy
29.11.12
✎
17:51
|
(54) Как то не коррелируется с (35) :):):)
|
|||
56
Reset
29.11.12
✎
17:54
|
(оффтоп)
Прогнал (42), включив замер производительности Что заметил любопытного: Массив.Добавить(Стр); 3 872 751 6,860903 16,19 Сч=Сч+1; 3 872 751 5,248156 12,39 Т.е. Массив.Добавить() всего в полтора раза медленнее чем Сч=Сч+1 |
|||
57
zdas
29.11.12
✎
17:55
|
(55) в (35) имеется ввиду уже со всеми преобразованиями
|
|||
58
Heckfy
29.11.12
✎
17:55
|
(56) А если убрать
Если Сч%50000=0 Тогда Состояние(""+Сч); КонецЕсли; то еще быстрее будет. :) |
|||
59
Reset
29.11.12
✎
17:57
|
(58) С этим все понятно, но добавление в массив меня удивило
|
|||
60
Heckfy
29.11.12
✎
17:57
|
(57) В топике: "Задача - распарсить как можно быстрее файл >3 500 000 строк в массив."
А уж что ты там преобразовываешь - это отдельная песня. |
|||
61
zdas
29.11.12
✎
17:58
|
(60) ну я сказал что имел ввиду в (35).
|
|||
62
Reset
29.11.12
✎
17:59
|
Ну видно он как-то очень не торопясь строки эти разбирает.
Причем так, что проблема с памятью образуется. Ибо без этого все хорошо -->(54) |
|||
63
zdas
29.11.12
✎
18:02
|
там был косяк в СтрПолучитьСтроку(строка, номер)
|
|||
64
Reset
29.11.12
✎
18:03
|
(63) читал весь файл в строку и потом 3 миллина раз СтрПолучитьСтроку? ;D
|
|||
65
zdas
29.11.12
✎
18:03
|
я так понимаю она и была всему виной. всем спс:)
|
|||
66
zdas
29.11.12
✎
18:04
|
(63) аха:) было так:)
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |