12 сентября 2014 г.

Онтологии. OWL 2.0

Рассказывал про применение онтологий, OWL 2.0 и сравнение возможностей OWL с KG (Knowledge Guide, разработка ИжГТУ). Дело было в 2012 году. Составил схему лекции.

Схема лекции по OWL 2.0 (узлы с примерами свёрнуты)


7 сентября 2014 г.

Поделить текстовый файл на части

Поделить текстовый файл на части

Назначение

Если нужно открыть большой Log-файл в Windows, но ни один из установленных инструментов не позволяет открыть файл такого объёма (100-2000 МБайт). То можно поделить файл на меньшие части, используя командный сценарий (bat-ник). Возможность выполнить bat-файл всегда есть в Windows. Расход оперативной памяти при выполнении разделения будет приемлемым - двойной размер файла (600 МБайт ОЗУ для файла в 300 МБайт).

Текст сценария SplitBigTextFile.bat

echo off
setlocal enabledelayedexpansion

set fileName=%1
set partSize=%2
set partExt=%3

set index=0
set partNumber=0

for /F "tokens=*" %%i in (!fileName!) do (
set /a index+=1
if !index! GTR !partSize! (
set /a partNumber+=1
set index=0
)
@echo %%i >> !fileName!.!partNumber!.!partExt!
)

Параметры

Параметры выполнения скрипта, должны быть переданы при вызове:
  1. Путь к текстовому файлу, на основе которого надо создать несколько маленьких файлов.
  2. Максимальное количество строк, в маленьком файле.
  3. Расширение для создаваемых маленьких файлов.

Пример

Пример вызова:
SplitBigTextFile.bat D:\BigLog.log 10000 log

В результате работы сценария рядом с файлом D:\BigLog.log будут созданы файлы:
  1. D:\BigLog.log.1.log
  2. D:\BigLog.log.2.log
  3. D:\BigLog.log.3.log
  4. ...
В каждом из которых будет только по 10000 строк текста. В последнем файле, может быть менее 10000 строк.

А такие небольшие файлы, уже можно будет просмотреть в имеющемся в данный момент текстовом редакторе.

update 11 марта 2015. При работе потребуется ОЗУ в два раза больше размера файла. Для начала работы объём свободной оперативной памяти должен быть больше объёма файла. Так если файл размером 2 ГБайт, то при свободных 2,3 ГБайт процесс запустится и будет работать. Файлы более 2 ГБайт не разделял таким способом — памяти не хватает. Обработка некоторых текстовых файлов с кодировкой UCS-2 Little Endian не работает изначально (так выгружаютя файлы реестра *.reg). Чтобы заработала можно с помощью команды type перенести содержимое сбойного файла в новый файл командой:

type сбойныйФайл.txt > новыйФайл.txt
теоретически, могут потеряться данные, так как кодировка файла сменится на ANSI, но на практике данные не теряются — большая часть символов латинские.

Выбрать случайную запись из таблицы

Выбрать случайную запись из таблицы

Назначение

При подготовке к объёмному тестированию нужно наполнить базу данных связанными тестовыми данными. Если в тестируемой системе нет сложных прав доступа и фильтраторов, то для ускорения процесса заполнения базы данных данными можно использовать SQL-запросы. Нагенерировать связанных данных, работая с базой напрямую. При этом нужно выбирать случайные записи из связанных таблиц.

Теория

Для выборки случайной записи используется сортировка по случайному значению.
Из отсортированной выборки выбирается первая запись.

Для получения случайного значения подойдут функции:
  • RAND();
  • NEWID().

Выбор первой записи задаётся инструкцией TOP(1).

Примеры

Пример результирующего SQL-запроса:
SELECT TOP(1) "ID", "Text"
FROM "DataTable"
ORDER BY NEWID()

Боле быстрый код:
SELECT TOP(1) "ID", "Text"
FROM "DataTable"
ORDER BY RAND()

Если нужно наложить фильтр на данные из таблицы, используется инструкция WHERE.
SELECT TOP(1) "ID", "Text"
FROM "DataTable"
WHERE "ID" >= 100 AND "ID" <= 1000
ORDER BY RAND()

Примечание

Если надо будет SQL-запросами создать миллионы связанных записей. То от идеи случайной выборки лучше отказаться.
Сценарий заполнения базы данных зависнет. В случае огромного количества записей, надо использовать вычисления. Это возможно, если в качестве идентификаторов используются последовательные целые числа.

Например, в таблице "Links" в поле "FolderID" нужно вставить случайное значение из поля "ID" таблицы "Folders", где "ID" - целочисленный счётчик.
Заранее создаётся необходимое тестовое количество записей в "Folders" с подряд идущими значениями 5678...105678.
И при вставке не сканируем таблицу "Folders", а сразу вычисляем случайное значение "ID" из интервала 5678...105678, с помощью RAND() и ROUND().

SELECT @ID = @НачалоИнтервала + ROUND(RAND() * (@КонецИнтервала - @НачалоИнтервала), 0)

Пример с интервалом 5678...105678:
SELECT @ID = 5678 + ROUND(RAND() * (105678 - 5678), 0)