Имя: Пароль:
1C
1С v8
строка в массив
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) аха:) было так:)