Обработка csv файла около 300 000 строк. #581394


#0 by Prilepsky
Подскажите, как быстрей всего обработать такое количество строк?
#1 by Живой Ископаемый
что такое обработать?
#2 by Prilepsky
Записать, допустим, в табличную часть документа или перебрать и по каждой строке сделать запись в регистре сведений.
#3 by Злопчинский
а в чем принципиальная проблема?
#4 by Kassius
Нужно сразу понять, такой массив нужно постоянно обрабатывать или загрузить и забыть?
#5 by Prilepsky
Проблема, что перебором строк - очень долго. Пробовал через АДО но видимо где-то накосячил и у меня грузилось только первые 4000 строк. Периодически придется загружать подобные массивы. Если это было разовая операция, я бы и часик подождал , пока построчно все переберется =)
#6 by big
Файлы 2-4 Гб (большего размера просто не было ещё) прекрасно обрабатываются перебором строк. Причём не важно снеговик это или клюшки.
#7 by МихаилМ
как раз для этого (обработка рекордсетов адо ) первоначально и создавался энтерпрайз интегратор
#8 by Prilepsky
Не подскажешь как ты это реализовал? Я перебирал вот так:
#9 by Prilepsky
А вот такой код с АДО: Возвращает таблицу с 3 тысячами строк (И понятие не имею, почему так)
#10 by big
Я через FileSystemObject делаю. Как вариант - м.б. в строке недопустимые для АДО символы есть? Бывает, что в текстовый реквизит скопипастят вместе с текстом ПС+ВК и выборка сбивается
#11 by Prilepsky
Файл генерируется автоматически, поэтому навряд ли именно на этой строке какой-то символ вылезает..
#12 by skunk
это какие такие символы
#13 by big
я предположил, что ВК+ПС может мешать.
#14 by Prilepsky
Через FileSystemObject так ? Не быстрее первого метода, который я написал.
#15 by big
Да ладно - медленнее. :) На старом П-4 файл 4 Гб разбирается в течение 40-50 минут. Причем посимвольно строка перебирается.
#16 by Prilepsky
Точно такой же код у тебя разбирает 4 гб за 40-50 минут? Ппц, у меня этот код разбирает 33 мб столько же... А комп не из слабых.
#17 by big
вместо OpenTextFile используй OpenAsTextStream
#18 by kosts
Думаю этот код изначально неподходящий для больших файлов. Вот глянь: ЧтениеТекста (TextReader) Методы: Конструкторы: По имени файла Формирование неинициализированного объекта Описание: Предназначен для последовательного чтения текстовых файлов (большой длины). Доступность: Тонкий клиент, сервер, толстый клиент, внешнее соединение. Пример: См. также: ЗаписьТекста ЧтениеТекста, конструктор По имени файла
#19 by Prilepsky
Вроде бы быстрей... Сейчас разбираться будет, минут 20. Можно еще как-нибудь ускорить ? А то все равно в отношение 33мб к 4гб - это не круто
#20 by kosts
Предполагаю, что основные тормоза в разборе полученной строки.
#21 by Prilepsky
В том то и дело, я не разбираю строку. Тупо перебираю и вывожу состояние (номер текущей строки). Мне сейчас нужно найти метод, который быстрей всего будет перебирать все строки, а уже потом буду разбирать.
#22 by kosts
Ну будут потом...
#23 by Prilepsky
Что будут потом? :)
#24 by kosts
Ну основные тормоза будут именно при разборе строки, т.к. это выполняется на встроенном языке
#25 by marty0701
Вырежи из кода в вывод в цикле и удивись.
#26 by Serginio1
Достаточно быстро обрабатывает
#27 by Sammo
Из встроенных средств - ЧтениеТекста. Или fso
#28 by rutony
Я юзаю что то похожее, но без контроля данных... 100 000+ строк, 10+ колонок, обрабатывается за 1-2 минуты... Правда винт SSD... На обычном около 10-15 минут...
#29 by Serginio1
Ну засосать то в память 100 000 строк это не проблема. У меня таким макаром и по 300 000. Вместе с записью в базу меньше 10 минут. У тебя скорее всего упирается в запись
#30 by Serginio1
Ты состояние выводи через 10000 (Если НомерСтроки % 10000=0 тогда), а то у тебя все время на вывод состояния уходит.
#31 by Prilepsky
у тебя код из за 10 минут записывает в базу 300 000 строк ? В функцию ИзСтрокиСРазделителями передается S-строка, Delimiter="," - разделитель, QuoteChar="""" - как цитаты выделены? А какой функцией сами строки читаешь ?
#32 by Serginio1
По разному. Но насчет 300 000 эт простой ОбщегоНазначения.РазложитьСтрокуВМассивПодстрок. Чере ТабличныйДокумент или чтениеФайла. Второе предпочтительнее. Ав большинстве случаев если файл нормальный гружу его пярмым булк запросом  в SQL. У меня пока 13 версия, а в 14 можно вроде и внешние текстовые источники исользовать.
#33 by Serginio1
QuoteChar="""" это разделитель строк. Если в строке будет кавычка то она экранируется кавычкой нпример ЭтоТекст"СкавычкойИ,запятой будет выглядеть как  "ЭтоТекст""СкавычкойИ,запятой"
#34 by VVi3ard
Сколько у тебя по времени выполняется данный цикл? Должен не больше 2-3 минут, я выгружал недавно в файлы по 3-4 миллиона строк и затем через SQL BulkInsert вставлял их в таблицу на это уходит примерно 15 минут. И это еще с Форматом полей.
#35 by Serginio1
Обчно хватает табуляции и ОбщегоНазначения.РазложитьСтрокуВМассивПодстрок. Но нужно следить что бы в строке не было табуляторов
#36 by steep1
#37 by Serginio1
Все зависит от количества идексов и железа. У меня запись с объединением в темп таблицу миллионную таблицу уходит около минуты. Точно не замерял так как у меня еще присутствует Merge
#38 by Prilepsky
В общем, все читает быстро, если не писать "Состояние("Текущая строка "+n);" =) Буду копать дальше. Всем спасибо!
#39 by VVi3ard
Согласен.
#40 by VVi3ard
:) Что и требовалось доказать. Чтобы все было корректно вычисляй шаг равный 1% и каждый процент выводи состояние и все будет отлично.
#41 by marty0701
Из этого было не понять?
#42 by Snorkler
Может полезно будет:
#43 by Prilepsky
Как только вырезал - понял.
#44 by rs_trade
а там какие значения в полях. ссылочные есть?
#45 by Prilepsky
нету
#46 by rs_trade
bulk insert можно попробовать использовать.
Тэги: 1С 8
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С