Имя: Пароль:
1C
1С v8
как загрузить большой файл в 1с ?
0 datog
 
05.07.17
16:44
уф
есть текстовый файл 1.3 гига
его нада загрузит в 1c в справочник.
30 миллионов строк.

пока пытаюсь загрузить просто считывая,  13 гиг памяти в диспетчере задач скушала 1с.думаю вывалится когда кончится память.
как лучше сделать?
1 Numerus Mikhail
 
05.07.17
16:45
Считывать блоками
2 datog
 
05.07.17
16:46
(1) а как?
файл выложили наши доблестные государственные службы на официальном сайте именно в таком целом виде. ничем открыть такой файл полностью не получается
3 Numerus Mikhail
 
05.07.17
16:47
(2) что-то типа такого:

      //Прочитать первую строку
      Текст = Новый ЧтениеТекста(Путь);
      Стр = Текст.ПрочитатьСтроку();
4 Wirtuozzz
 
05.07.17
16:47
(0) УТ 11 файл 14 Гигов. Загрузка была 5 или 6 часов. Но ничего, загрузилось.
5 Wirtuozzz
 
05.07.17
16:48
Такие файлы надо грузить потихонечку. Справочник лучше выгружать частями если есть возможность. Так проще будет.
6 Фрэнки
 
05.07.17
16:50
интересно, а в комплекте с этим файлом (если это не загружать в 1С) имеется что-то, что умеет с ним работать?
7 Фрэнки
 
05.07.17
16:52
может это CSV файл и его можно затолкать в СУБД какую-то и затем подключиться к этой СУБД для обработки данных уже в 1С ?
8 Мыш
 
05.07.17
16:52
(6) Дожили. Для работы с чем-то необычным программисты спрашивают доп. ПО )
9 Wirtuozzz
 
05.07.17
16:53
(7) зачем?
10 Фрэнки
 
05.07.17
16:54
(8) я не запрашиваю, а мне просто интересно, как сами авторы файла предполагали его дальнейшее использование
11 Мыш
 
05.07.17
16:54
Поток (Stream)

Описание:
Представляет собой поток данных, который можно последовательно читать и/или в который можно последовательно писать.
Экземпляры объектов данного типа можно получить с помощью различных методов других объектов.

Доступность:
Тонкий клиент, веб-клиент, сервер, толстый клиент, внешнее соединение, интеграция.
12 Мыш
 
05.07.17
16:55
(10) Как обычно, никак не предполагали. Проблемы негров шерифа не тревожат.
13 Базис
 
naïve
05.07.17
16:55
Тебе точно надо этот файл держать в базе, а не снаружи? Как часто он может меняться?

Если именно в лоб хочешь грузить, то разбей его (да хоть winrar-ом на части без сжатия) на удобные по размеру куски и залей. 10 строк, что попадут на разбиение, потеряешь. Никому о них не говори.
14 Wirtuozzz
 
05.07.17
16:56
(0) Не парь мозги ни себе ни нам. Бери нормальный комп а не калькулятор. Файлы до 14 гигов грузятся, и это мной проверено. Они грузятся на моей персоналке (32 гб Оперативки) и на серваке. Не скажу конфиг, не заморачивался.

На серваке файл грузился около 5-6 часов, и тут не возникает никаких проблем.

Так что загрузить файл 1.5 ГБ - легко, если файл нормальный.
15 Lama12
 
05.07.17
16:56
(0) А что за файл?
16 Wirtuozzz
 
05.07.17
16:57
Правда я грузил xml файл, обработкой универсальный обмен данными в формате xml
17 Базис
 
naïve
05.07.17
16:58
(15) +1. Дай скачать :)

ЗЫ За 54-ФЗ можно отправлять чеки на мыло депутатам, производителям оборудования и налоговым.
18 vis_tmp
 
05.07.17
17:00
Что за файл-то?
19 Базис
 
naïve
05.07.17
17:04
Щас сюда выложит, наверное.
20 ptiz
 
05.07.17
17:07
(0) "загрузить просто считывая,  13 гиг памяти в диспетчере задач скушала 1с." - криво считываешь
21 Господин ПЖ
 
05.07.17
17:11
может он строки складывает - это память хорошо съедает
22 datog
 
05.07.17
17:18
(20) а как "прямо" ?
23 Фрэнки
 
05.07.17
17:19
(22) смотри выше упоминание про Поток
24 xaozai
 
05.07.17
17:22
25 Волшебник
 
модератор
05.07.17
17:30
(0) А что за файл на 30 млн строк? Что он содержит?
26 Фрэнки
 
05.07.17
17:40
(22) ну если уж совсем трудно ориентироваться в синтакс помощнике, то вот пример
---
ЧтениеДанных (DataReader)
Описание:

Объект предназначен для чтения различных типов данных из источника данных. В качестве источника могут выступать Поток, Файл или ДвоичныеДанные.
Необходимо соблюдать следующий порядок работы с данным объектом:
Создать объект ЧтениеДанных на основании источника данных.
Выполнить требуемые действия с помощью объекта.
Закрыть экземпляр объекта ЧтениеДанных.
При необходимости использовать другие методы для работы с источником данных, требуется сначала закрыть экземпляр объекта ЧтениеДанных с помощью метода Закрыть, выполнить необходимые действия над источником, установить требуемую позицию для чтения из источника и создать новый экземпляр ЧтениеДанных.

Доступность:

Тонкий клиент, веб-клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение(клиент), мобильное приложение(сервер).
Пример:

ПотокДанных = ФайловыеПотоки.ОткрытьДляЧтения("document.txt");
ЧтениеДанных = Новый ЧтениеДанных(ПотокДанных);
Cтрока1 = ЧтениеДанных.ПрочитатьСтроку();
ЧтениеДанных.Закрыть();

ПотокДанных.Перейти(200, ПозицияВПотоке.Начало);

ЧтениеДанных = Новый ЧтениеДанных(ПотокДанных);
Cтрока2 = ЧтениеДанных.ПрочитатьСтроку();
ЧтениеДанных.Закрыть();

---
27 МихаилМ
 
05.07.17
20:56
(25)
скорее всего
список недействительных российских паспортов
http://services.fms.gov.ru/info-service.htm?sid=2000
28 Adilgeriy
 
05.07.17
21:10
(27) согласен. тоже пробовал его открыть в экселе. тот сказал иди нафиг. в 1с не затаскивал. под него отельную базу держать надо
29 datog
 
06.07.17
11:25
(23) мне файл хотя бы загрузить нужно ."поток" я так понял больше для обработки уже имеющегося.
либо грузить потоком с разбитием на части ? что то хардкор какой то.
у меня i7-4790 , 16u, памяти, ssd , win7-64
пока не загрузилось...  

Текст = Новый ТекстовыйДокумент;
Текст.Прочитать(Путь);
Для НомерСтроки = 2 по Текст.КоличествоСтрок()  Цикл
КонецЦикла;
пока только эти строки.всего 100 миллионов строк.дальше 20 миллионов так и не дошел
30 Кирпич
 
06.07.17
11:30
(0) Нахрен в 1с грузить 30 млн. строк? Пускай они отдельно хранятся. Ну а если уж точно надо, то надо загружать частями. Раздели файл на 10000 частей и грузи.
31 Базис
 
naïve
06.07.17
11:36
Вебсервис надо под такое, наверное.

Ты разбить его на куски смог?

Обновления как будут? Как полностью новый файл, как добавления, как изменения, ХЗ-как?
32 datog
 
06.07.17
11:44
(30) ну все равно csv придется как то преобразовать во что то.
33 dachnik
 
06.07.17
11:47
(0) А почему именно в справочник, а не регистр сведений. Всяко по шустрее будет работать. Ну и поддерживаю вопрос - зачем это тянуть в рабочую базу? Не проще ли создать отдельную таблицу/базу?
34 Господин ПЖ
 
06.07.17
11:49
(32) положить в sql. через dts это быстро делается
35 Кирпич
 
06.07.17
11:50
(32) ёпрст. напиши какой нибудь примитивный http сервер на C# или NodeJS. Запихай этот csv в SQLite. Тут делов на пару часов.
36 xaozai
 
06.07.17
11:56
(35) Можно без сервисов и С# обойтись. В MSSQL добавляется новая база, там создается таблица с нужными полями, файл читается либо потоком, либо FileSystemObject, заносится в эту новую базу простыми insert'ами (ADODB.Connection). Потом в рабочей базе настраивается внешний источник данных, и данные получаются при необходимости запросами...
37 Кирпич
 
06.07.17
12:00
(36) ну это кому как нравится. вариантов море. главное в 1с не тащить это всё.
38 datog
 
06.07.17
12:25
переделал ,перенес файл csv на ssd ?стало грузиться за 10 минут.
    Текст = Новый ЧтениеТекста(Путь, КодировкаТекста.ANSI);
    Стр = Текст.ПрочитатьСтроку();
    Пока Стр <> Неопределено Цикл // строки читаются до символа перевода строки
        мСтрокФайла.Добавить(Стр);
        //Сообщить(Стр);
        Стр = Текст.ПрочитатьСтроку();
    КонецЦикла;
39 Господин ПЖ
 
06.07.17
12:30
формально сервис лучше с точки зрения мобильности, безопасности и независимости
40 Кирпич
 
06.07.17
12:43
(38) повлияло даже не столько SSD, сколько перенос файла на другой физический диск.
41 mistеr
 
06.07.17
13:11
(29) Пойми наконец разницу между ТекстовыйДокумент.Прочитать() и ЧтениеТекста.ПрочитатьСтроку()! В первом случае память выделяется в размере всего файла, а во втором только на одну строку.
42 Shur1cIT
 
06.07.17
13:39
(0) все не читал, почему бы на потоки не разобить и не грузануть файл?

второй экзотический вариант, создать в справочнике 30 милионов элементов опятьже в многопоточном режиме, далее средствами скуля напрямую через скуль грузить в эти заготовки данные.
43 Кирпич
 
06.07.17
13:48
(42) так тормозит запись в базу 1с. 1с прочитает такой текстовый файл за пару минут.
44 Shur1cIT
 
06.07.17
13:54
(43) запись многопоточно можно запустить
45 Кирпич
 
06.07.17
14:02
(44) да не думаю, что будет быстрее. если бы в разные справочники писало, а то в один. конкуренция и всё такое.
46 mistеr
 
06.07.17
14:29
(43) Кто сказал, что тормозит запись? В (0) только память кушается.
47 Кирпич
 
06.07.17
14:50
(46) ну автора вроде научили как не читать в память весь файл целиком. а добавить в 1с 30 млн. записей сам попробуй и скажи тормозит или не тормозит.
48 mistеr
 
06.07.17
15:17
(47) Не думаю, что скорость записи зависит от общего количества.
49 Кирпич
 
06.07.17
15:21
(48) нифига ты сказанул :)
а от чего же она зависит тогда? от фазы луны?
50 datog
 
06.07.17
16:20
скорость записи в регистр сведений это конечно жесть.
51 Fram
 
06.07.17
16:30
(50) не пиши в рабочую базу. Создай отдельную скуль базу на любом движке.
Подумай как будешь обслуживать потом рабочую базу.
52 Кирпич
 
06.07.17
17:00
(51) да ему уже намекали, что нормальные люди такое в 1с не загружают.
53 datog
 
06.07.17
17:55
(52) под это дело отдельная база 1с.
но загрузится ко второму пришествию ....
54 mistеr
 
06.07.17
18:04
(49) От железа в основном.

(53) Терпи. Это 1С.
55 Fram
 
06.07.17
20:50
(53) мс скуль, в зависимости от железа, скорее всего, загрузит такое за несколько минут
56 Fram
 
06.07.17
20:51
(55) а то и секунд
57 Maniac
 
06.07.17
21:12
хы...

Нужно разделить все на процессы

1) чтение файла
2) запись в 1С элементов

А вот самая фигня будет если этот файл нужно будет повторно грузить с синхронизацией уже существующих элементов.

Если на какой то стадии произойдет сбой - и в базе появятся элементы. придется все чистить в базе. Что на мой взгляд станет тупиком - придется поднимать снова из резерва базу.

Если еще и с синхронизацией... не знаю чо даже сказать.

Самый трудоемкий из всего процесс - запись в базу справочника. 90 процентов времени.

Вывод - НАФИГА ТЫ ГРУЗИТЬ ЭТО ВСЕ?

Лучше в регистр сведений пихни все для начала - а создавай элементы потом по мере необходимости.
58 Maniac
 
06.07.17
21:14
Бей частями.

100к строк считал - впихнул в регистр сведений.
следующий 100 считал - в регистр сведений.

по 100к строк.


Как минимум если чо регистр почистить быстро можно. А вот справочник - замахаешся чистить.

Там где его дальше юзать нужно будет - создавай элементы по мере необходимости.

Нужен юзеру элемент - поиск - нет в справочнике. нашли в регистре - создали.
59 Maniac
 
06.07.17
21:17
по 100к строк думаю отработка будет на цикл чтение и запись если там ничо сложного - ну секунд 30.

30 на 30 = 900 секунд.

За 15 минут ты это все загрузишь в регистр сведений. 30 лямов строк.

В справочник я бы не грузил - сначала нужно понять что это и зачем оно.
60 Maniac
 
06.07.17
21:18
блин ошибся.100к если 30 секунд.
То 30 лямов это умножить на 300.

9000 секунд. полтора часа
61 datog
 
06.07.17
21:32
я ошибся. там 107 миллионов строк
62 d4rkmesa
 
06.07.17
21:41
20 миллионов строк без особых проблем грузил, наверное и 100 загрузится, я так понял, операция одноразовая?
63 Maniac
 
06.07.17
21:42
(61) ууу чувак.
Могй дать человека который тебе СУБД накидает. А уже из нее будешь в 1С таскать только то что надо.

Забудь про то чтобы в 1С это грузить.
Я уверен тебе будет стоять задача обновлять.

А значит возникнет момент синхронизации - поиска.
Вот тут все дело и погибнет.
64 МихаилМ
 
06.07.17
22:08
(61)
значит я угадал: выгрузите list_of_expired_passports

на хабре есть статья с его участием.
65 datog
 
06.07.17
22:23
спасибо , я должен сам решить эту задачу.
66 Фрэнки
 
07.07.17
09:13
характерный поиск яндекс выдает по list_of_expired_passports

---
TopDownloads - Архивы - list_of_expired_passports.csv.bz2
topdownloads.ru›…file/list_of_expired_passports…
Закачать: http://guvm.mvd.ru/upload/expire.../list_of_expired_passports.csv.bz2 Файл расположен на: http://guvm.mvd.ru Для быстрой и надежной закачки используйте Download Master.
2
Как загрузить файлик с ресурса guvm.mvd.ru | Форум
forum.mista.ru›Раскрути›?id=778059
HTTPЗапрос = Новый HTTPЗапрос("upload/expired-passports/list_of_expired_passports.csv.bz2") ... This response is only cacheable if indicated by a Cache-Control or Expires header field.
3
Почему Go превосходит посредственность / Хабрахабр
habrahabr.ru›post/260451/
? ? Задачка: Есть база невалидных паспортов http://www.fms.gov.ru/upload/expired-passports/list_of_expired_passports.csv.bz2 требуется утилитка для проверки паспорт нормальный или нет.
4
bulk insert и гигантский файл / Microsoft SQL Server / Sql.ru
sql.ru›Форум›…insert-i-gigantskiy-fayl
Пытаюсь закачать в базу файл недействительных паспортов list_of_expired_passports.csv Файл весит 1 гигабайт и содержит порядка 80 млн записей в формате
5
Система межведомственного электронного... | Форум
bankir.ru›dom/forum/департамент-технологий/…
2. Как найти "авторов" этого решения в ФМС и попросить их о следующем : файл list_of_expired_passports.csv.bz2 должен быть назван так : 20140618-235959-list_of_expired_passports.csv.bz2 (примерно!!!)
67 Кирпич
 
07.07.17
09:22
(65) "я должен сам решить эту задачу" :)
А нафиг тогда на мисте ветки создавать.
68 Базис
 
naïve
07.07.17
10:01
А какие поля в этой табличке?
69 МихаилМ
 
07.07.17
10:05
(68)

серия и номер (паспорта)
70 datog
 
07.07.17
10:43
(67)спросить совета
71 Maniac
 
07.07.17
10:44
это явно БД не для 1С и в 1С нафиг не нужна
72 МихаилМ
 
07.07.17
10:46
(71)
скажите это 1с про кладр
73 Maniac
 
07.07.17
10:48
(72) ему тоже
74 Maniac
 
07.07.17
10:49
уже давно все через сервисы работает
75 Кирпич
 
08.07.17
21:06
Пробовал загружать в sqlite. Загрузилось за 7 минут на i5 без ssd.
76 Garykom
 
гуру
08.07.17
22:16
(75) В данном случае не надо ничего никуда "грузить".
Надо читать в поток файл и создавать "индекс" в какой то БД (можно и в sqlite и даже в 1С).
Этот индекс это по сути подсистема для быстрого нахождения мест в исходном текстовом файле на диске.

Кнут велик https://www.opennet.ru/base/dev/build_search_index.txt.html
По сути пишем свой "движок текстовой БД" не трогая/не изменяя исходные данные и работая только с индексом.
77 Garykom
 
гуру
08.07.17
22:20
(66) Будешь смеяться но задача уже баян (для нас) ибо http://www.fedsfm.ru/news/355
78 МихаилМ
 
08.07.17
22:24
я бы попробовал применить
Задача на поиск в массиве
79 Garykom
 
гуру
08.07.17
22:25
(77)+ Пришел к нам покупать золото, мы просим для скидки получить нашу карту. Чтобы получить карту надо заполнит простую анкету.
Там есть серия/номер - говорим "это на случай утери карты с бонусами чтобы восстановить".

Если некто указал "недействительный паспорт", мы обязаны это обнаружить и настучать в течении 7 дней.

"Подпунктом 3 пункта 1 статьи 7 Федерального закона № 115-ФЗ закреплена обязанность организаций в случае возникновения сомнений в достоверности и точности ранее полученной информации обновить сведения о клиенте, его представителях, выгодоприобретателях и бенефициарных владельцах в течение семи рабочих дней, следующих за днем возникновения таких сомнений."
80 Garykom
 
гуру
08.07.17
22:28
(76)+ Прикольно практически к тому же что и мы пришли https://habrahabr.ru/post/307568/
81 Garykom
 
гуру
08.07.17
22:33
(80)+ Только я еще сверху хеш-функцию навернул по "множеству уникальных цифр в паспорте" для выделения блока в котором нуна искать дальше.

К примеру есть паспорт серия 1111 222222, цифры только (1,2) - итого поиск сразу сокращается и далее уже их метод по номеру.
82 Кирпич
 
09.07.17
08:46
(76) "Надо читать в поток файл и создавать "индекс" в какой то БД"
а я мля что сделал? создал индекс в sqlite.
83 Кирпич
 
09.07.17
08:50
(80) нафига изобретать велосипед, если можно тупо загрузить в проверенный годами sqlite или berkeleyDB
84 datog
 
18.07.17
08:21
как теперь ускорить поиск по таблице в ms sql ?
85 2dolist
 
18.07.17
08:31
(44) а как запустить запись многопоточно?
86 Два Плюс Два
 
18.07.17
08:36
(0) ADO Stream
87 Lama12
 
18.07.17
08:36
(84) Индексы?
88 Два Плюс Два
 
18.07.17
08:45
(84) Агрегаты. Если в оборотный регистр загрузишь. Только пересчитывать агрегаты надо вручную. Но если массив не меняется, то гут.
89 Два Плюс Два
 
18.07.17
08:46
Справочник делать не надо. Да и РС не факт что лучше оборотного регистра. Смотреть надо что грузишь... Чего потом иметь хочешь.
90 xaozai
 
18.07.17
09:36
(84) Добавьте индексы для полей поиска.
91 datog
 
18.07.17
15:33
сделал индекс, все стало работать быстрее.
а как быть с кодировкой? как ее корректно отобразить в 1с?
92 МихаилМ
 
19.07.17
10:32
заведите отдельную тему . опишите проблему подробней
93 Кирпич
 
19.07.17
11:22
(91) У тяебя ж там одни цифры. Накой тебе кодировка?
94 datog
 
21.07.17
17:18
(93) в файле есть серии символьные.и по 2 или 5 символов
95 Кирпич
 
21.07.17
18:16
(94) ага. там чего только нету
V-ЖЕ,646871
5ЕР6,94819
7СИ6,55479
CC88,3567
3ИР0,144478
15ЕР,709342
CC02,04167
18АГ,536340
5ЕР6,61547
13ЕР,740466
7ЕР7,19918
13ЮС,622545
9ЕР7,43617
16ЕР,613268
5-,685604
ЕС,765036
1ЖЕ,317072
Я не хочу быть самым богатым человеком на кладбище. Засыпать с чувством, что за день я сделал какую-нибудь потрясающую вещь — вот что меня интересует. Стив Джобс