Вопрос, непосредственно связанный с моим предыдущим Импорт данных секвенирования и обработка SAM-файлов в TDictionary
Ранее, когда мы держали данные для обработки в массиве записей, мы просто создавали типовой файл и сбрасывали данные (а затем архивировали в ZIP, хорошо сжималось):
type
data = record
<...>
end;
var
f: file of data;
d: array of data;
Теперь, если мы будем использовать структуру
type
DataType = record
name,qual, info, seq:string;
data:array[1..30] of double;
paired, structured:boolean;
ref:integer;
end;
TData3 = TDictionary
Можно ли использовать тот же подход, что и раньше, т.е. сбрасывать данные в типовой файл? Или необходимо использовать FileStream?
Ответ
Можно конвертировать в массив, но, подозреваю, что не нужно. Особенно, если вы планируете делать это лишь для записи. Гораздо проще работать с потоками. Могу привести пример, как это реализовано у нас в базовом классе:
TVCFFile = class (TDictionary
procedure TVCFFile.SaveToStream(stream: TStream);
var
posi: System.Generics.Collections.TPair
procedure TVCFFile.SaveToZip(const AFileName: string);
var
stream: TStream;
zipFile: TZipFile;
begin
stream := TMemoryStream.Create;
try
SaveToStream(stream);
stream.Position := 0;
zipFile := TZipFile.Create;
try
zipFile.Open(AFileName, zmWrite);
zipFile.Add(stream, 'bigdata.tvb');
zipFile.Close;
finally
zipFile.Free;
end;
finally
stream.Free;
end;
end;
procedure TVCFFile.SaveToFile(const AFileName: string);
var
stream: TStream;
begin
stream := TFileStream.Create(AFileName, fmCreate);
try
SaveToStream(stream);
finally
stream.Free;
end;
end;
Можно просто записать в файл, можно сразу в ZIP-файл, скорость записи и считывания достаточно велика (для загрузки есть аналогичные методы, строите их от обратного). Плюс, понадобятся методы для загрузки из SAM, записи в него же, возможно, понадобится поддержка BED, VCF и прочее, а, может, вы всё это сделаете в других классах.
Комментариев нет:
Отправить комментарий