Имя: Пароль:
1C
 
1с лог как внешний источник данных, проблемы с размером и памятью
0 vde69
 
17.12.14
11:59
есть файл в новом формате 1Cv8.lgd, размер 40 гигов

в 1с сделал внешний источник данных и на сервере

Функция ПолучитьЖР(ИмяФайла) Экспорт
    Результат = Новый ТаблицаЗначений();
    
    ПараметрыСоединения = Новый ПараметрыСоединенияВнешнегоИсточникаДанных;
    ПараметрыСоединения.СтрокаСоединения = "DRIVER=SQLite3 ODBC Driver;Database=" + ИмяФайла + ";BigInt=1;";
    ВнешниеИсточникиДанных.ЖурналРегистрации.УстановитьОбщиеПараметрыСоединения(ПараметрыСоединения);
    ВнешниеИсточникиДанных.ЖурналРегистрации.УстановитьСоединение();

    Запрос = Новый Запрос();
    Запрос.Текст =
    
    "ВЫБРАТЬ
    |    EventLog.Ссылка,
    |    EventLog.rowID,
    |    EventLog.severity,
    |    EventLog.date КАК date,
    |    EventLog.connectID,
    |    EventLog.session,
    |    EventLog.transactionStatus,
    |    EventLog.transactionDate,
    |    EventLog.transactionID,
    |    EventLog.userCode,
    |    EventLog.computerCode,
    |    EventLog.appCode,
    |    EventLog.eventCode,
    |    EventLog.comment,
    |    EventLog.metadataCodes,
    |    EventLog.sessionDataSplitCode,
    |    EventLog.dataType,
    |    EventLog.data,
    |    EventLog.dataPresentation,
    |    EventLog.workServerCode,
    |    EventLog.primaryPortCode,
    |    EventLog.secondaryPortCode
    |ИЗ
    |    ВнешнийИсточникДанных.ЖурналРегистрации.Таблица.EventLog КАК EventLog
    |
    |УПОРЯДОЧИТЬ ПО
    |    date";
    
    РезультатЗапроса = Запрос.Выполнить();
    Для Каждого эл из РезультатЗапроса.Колонки Цикл
        Результат.Колонки.Добавить(эл.Имя, Эл.ТипЗначения, эл.Ширина);
    КонецЦикла;
        
    Выборка = РезультатЗапроса.Выбрать();
    Дамп = 0;
    Пока Выборка.Следующий() Цикл
        Дамп = Дамп + 1;
        Если Дамп = 1000 Тогда
            Прервать;
        КонецЕсли;

        НоваяСтрока = Результат.Добавить();
        ЗаполнитьЗначенияСвойств(НоваяСтрока, Выборка);
    КонецЦикла;
    
    Результат.Выгрузить();
    ВнешниеИсточникиДанных.ЖурналРегистрации.РазорватьСоединение();
    
    Возврат Результат;
КонецФункции

вылетает по памяти....
ТОР 1000 не работает, говорит ошибка синтаксиса...
1 H A D G E H O G s
 
17.12.14
12:02
Жесть, жесть, жесть.
2 H A D G E H O G s
 
17.12.14
12:02
vde, я тебя не узнаю.
3 H A D G E H O G s
 
17.12.14
12:05
1) Обрабатывать порциями.
2) http://sql-help.ru/advanced/sql-limit/
4 vde69
 
17.12.14
12:10
как сделать напрямую я знаю, я хотел в кои веки поюзать ВнешниеИсточникиДанных а на сколько я понимаю он тупо заливает во времянку весь источник?
5 H A D G E H O G s
 
17.12.14
12:18
(4) У тя падает на запросе или на ТЗ?
6 vde69
 
17.12.14
12:20
на запросе
7 H A D G E H O G s
 
17.12.14
12:24
(6) Limit попробовал?
8 Гёдза
 
17.12.14
12:32
(7) в 1сных запросах нет слова LIMIT
9 vde69
 
17.12.14
12:32
вешать сервак страшно, нету у нас тестового....

сейчас взял маленький файл, вроде все работат. После обеда посмотрю профайлером запрос к скулю...
10 orefkov
 
17.12.14
12:48
Фирма 1C в своем репертуаре. Вспоминается анекдот
- Я сотрудниками управляю методом кнута и пряника
- Я пробовал так, но не очень понравилось.
- Почему?
- Пряником бить не удобно.

Так вот такое же ощущение, что даже когда 1С хочет предложить потребителям пряник, она им очень больно ударяет.
Зачем было делать лог в sqlite?
Весь мир спокойно пишет логи в текстовые файлы и не жужжит.
Просто периодически запускается какой-нить анализатор, который колбасит все в нужную форму.
Ну ладно, сделали лог в sqlite, бог с ним. Но почему пользователям не дали нормального средства работы с такими базами? В той же семерке есть 1sqlite и нормальный поставщик данных для ТабличногоПоля, туда загнать этот ЖР для просмотра - не пикнет даже, все покажет.
Внешние источники данных - тоже та еще кривость. На что не посмотришь - всё как-то они очень странно реализуют. Извините, накипело.
По теме - в sqlite пишут не в начале запроса "top N", а в самом конце "limit N".
11 Sorm
 
17.12.14
12:51
(10) Текстовик на 40 Гб... Имхо, как-то не очень. Думаю, лучше перегонять просто в таблицу на скуле через IS.
12 DrZombi
 
гуру
17.12.14
12:54
(10) >>> Весь мир спокойно пишет логи в текстовые файлы и не жужжит.

Смысл писать туда, откуда его не прочтешь и за год.
Есть пример БД, где текстовый лог за Сутки открывается средствами 1С вечность :)
13 DrZombi
 
гуру
17.12.14
12:55
+(10) Внешние источники данных

Согласен, гадость еще та. Проще через АДО реализовать :)
14 AlteZ
 
17.12.14
13:06
(10,13)+100
(11) logrotate ?
15 orefkov
 
17.12.14
13:51
(14)
Именно.
16 Барматолог
 
17.12.14
14:05
одинэс, похоже, обрабатывает порциями, как сказали выше

а тут, скорее всего, лежат необработанные логи:
C:\Users\USR1CV8\AppData\Local\Temp\1c_logs
17 vde69
 
17.12.14
14:33
профайлером очень странно это выглядит....

сначало куча запросов (штук 200) типа

exec sp_executesql N'SELECT
T1._ConnectPrms
FROM dbo._ExtDataSrcPrms T1 WITH(NOLOCK)
WHERE T1._UserId = P1 AND T1._ExtDataSrcId = @P2',N'P1 varbinary(8000),@P2 varbinary(8000)',0xA63CD1E2950F8B5547C2866BBCB191DC,0x9FDDE39FDB8E6A944CE1FDC06B0403BD



потом идут


exec sp_executesql N'SELECT
T2._IDRRef,
T2._Version,
T2._Marked,
T2._Date_Time,
T2._Completed,
T2._Number,
T2._HeadTaskRRef,
T2._Started,
T2._Fld11043RRef,
T2._Fld11044_TYPE,
T2._Fld11044_RTRef,
T2._Fld11044_RRRef,
T2._Fld11045_TYPE,
T2._Fld11045_RTRef,
T2._Fld11045_RRRef,
T2._Fld11046,
T2._Fld11047_TYPE,
T2._Fld11047_RTRef,
T2._Fld11047_RRRef,
T2._Fld11048,
T2._Fld11049RRef,
T2._Fld11050RRef,
T2._Fld11051RRef,
T2._Fld11052,
T2._Fld11053,
T2._Fld11054RRef,
T2._Fld11055,
T2._Fld11056,
T2._Fld11057,
T2._Fld11058RRef,
T2._Fld11477RRef,
0 AS SDBL_IDENTITY
FROM dbo._BPr11013 T2
WHERE T2._IDRRef = P1 AND T2._Version <> @P2',N'P1 varbinary(16),@P2 varbinary(8000)',0xB9AB00265582BC2211E4803CCDB5F2D7,0x000000000047AD39



короче с ходу не разберешся :) но одно понятно - запросов очень много....
18 Лефмихалыч
 
23.12.14
09:40
(0) в скуль его втягивай и уже от туда читай.
Ни чего же не мешает каждую ночь:
1. скопировать ldg
2. загрузить в скуль
3. грохнуть оригинальный ldg при успешной загрузке
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший