До сих пор, работая непосредственно с SAM-файлами, мы использовали массивы. Сейчас хотим перейти на TDictionary, поскольку он гораздо удобнее в плане поиска. Возникают вопросы:
1. Иерархия словаря. Как я вижу себе структуру, которая была бы удобна для поиска:
type
DataType = record
name,qual, info, seq:string;
data:array[1..30] of double;
paired, structured:boolean;
ref:integer;
end;
TData3 = TDictionary
var
dd: TData1;
тогда я могу достаточно быстро пробежаться вниз по дереву chr->pos->ref и все записи будут уникальны. А для работы с переменной dd создаю свой класс, где будут все рутины.
Прав ли я, предполагая такую структуру?
Как правило, в большинстве биоинформатических утилит для обозначения хромосом используются строковый тип ['1'...'22','X','Y','MT']. Формально, я могу TData1 определить как
type
TData1 = TDictionary
но боюсь, что выигрывая в удобстве, потеряю в скорости поиска. Так ли это?
Спасибо заранее за помощь!
Ответ
Вначале отвечу на второй вопрос. По опыту, разницы в скорости не наблюдается. Более того, удобнее оставлять сведения о хромосоме именно в текстовом виде, так как порой приходится иметь дело со сложными именованиями хромосом, а не все утилиты поддерживают таблицу номерного соответствия.
Более того, я предлагаю совместить первый и второй уровень вашего словаря, сделав ключом сразу полную координату {chr, pos} в виде строки формируя её либо так Key:= chr + ',' + IntToStr(pos), либо так Key:= chr + #9 + IntToStr(pos). Первый случай удобен для экспорта в Excel или BED, второй - для SAM/BAM. Скорость поиска возрастёт, неудобств при формировании ключа - минимум.
И ещё, отдельный класс создавать, на мой взгляд, не нужно. Наследуйте непосредственно TDictionary, так будет гораздо удобнее.
Суммируя всё вышенаписанное, предлагаю сделать так:
type
DataType = record
name,qual, info, seq:string;
data:array[1..30] of double;
paired, structured:boolean;
ref:integer;
end;
TData3 = TDictionary
И встречный вопрос: ключ в TData3 и name в DataType у вас не одно и то же?
Комментариев нет:
Отправить комментарий