В этом примере показано, как создать сопоставленный файл памяти для данных последовательности и работать с ним без загрузки всей геномной последовательности в память. Целые геномы доступны для человеческих, мышиных, крысиных, фугу и ряда других модельных организмов. Для многих из этих организмов одна хромосома может быть длиной в несколько сотен миллионов пар оснований. Работа с такими большими наборами данных может быть сложной задачей, поскольку вы можете столкнуться с ограничениями используемого оборудования и программного обеспечения. В этом примере показан один из способов устранения этих ограничений в MATLAB ®.
Решение технических вычислительных задач, требующих обработки и анализа больших объемов данных, повышает спрос на компьютерную систему. Большие наборы данных занимают значительную память во время обработки и могут потребовать много операций для вычисления решения. Доступ к информации из больших файлов данных также может занять много времени.
Однако компьютерные системы имеют ограниченную память и конечную скорость ЦП. Доступные ресурсы варьируются в зависимости от процессора и операционной системы, последняя из которых также потребляет ресурсы. Например:
32-разрядные процессоры и операционные системы могут адресовать до 2 ^ 32 = 4 294 967 296 = 4 ГБ памяти (также известное как виртуальное адресное пространство). Windows ® XP и Windows ® 2000 выделяют только 2 ГБ этой виртуальной памяти каждому процессу (например, MATLAB). В UNIX ® виртуальная память, выделенная процессу, настраивается системой и обычно составляет около 3 ГБ. Приложение, выполняющее вычисление, такое как MATLAB, может потребовать хранения в дополнение к задаче пользователя. Основная проблема при обработке больших объемов данных заключается в том, что требования к памяти программы могут превышать доступные на платформе. Например, MATLAB генерирует ошибку «недостаточно памяти», когда требования к данным превышают приблизительно 1,7 ГБ в Windows XP.
Дополнительные сведения об управлении памятью и больших наборах данных см. в разделе Производительность и память.
На типичной 32-битной машине максимальный размер одиночного набора данных, с которым можно работать в MATLAB, составляет несколько сотен МБ, или около размера большой хромосомы. Отображение файлов в памяти позволяет MATLAB обходить это ограничение и позволяет работать с очень большими наборами данных интуитивно понятным образом.
Последние наборы данных генома можно загрузить с веб-сайта Ensembl. Данные предоставляются в нескольких форматах. Они регулярно обновляются по мере появления новой информации о последовательности. В этом примере будут использоваться данные ДНК человека, хранящиеся в формате FASTA. Хромосома 1 представляет собой (в выпуске GRCh37.56 от сентября 2009 года) сжатый файл объемом 65,6 МБ. После распаковки файла он примерно 250MB. MATLAB использует 2 байта на символ, поэтому при чтении файла в MATLAB потребуется около 500MB памяти.
В этом примере предполагается, что файл FASTA уже загружен и распакован в локальный каталог. Изменение имени переменной FASTAfilename при необходимости.
FASTAfilename = 'Homo_sapiens.GRCh37.56.dna.chromosome.1.fa';
fileInfo = dir(which(FASTAfilename))
fileInfo =
struct with fields:
name: 'Homo_sapiens.GRCh37.56.dna.chromosome.1.fa'
folder: '/mathworks/hub/qe/test_data/Bioinformatics_Toolbox/v000/demoData/biomemorymapdemo'
date: '01-Feb-2013 11:54:41'
bytes: 253404851
isdir: 0
datenum: 7.3527e+05
Отображение памяти позволяет MATLAB получать доступ к данным в файле, как если бы он находился в памяти. Для доступа к данным можно использовать стандартные операции индексирования MATLAB. См. документацию для memmapfile для получения дополнительной информации.
Можно просто отобразить файл FASTA и получить доступ к данным непосредственно оттуда. Однако файл формата FASTA содержит новые символы строки. memmapfile функция обрабатывает эти символы так же, как и все другие символы. Их удаление перед сопоставлением памяти файла упростит операции индексирования. Кроме того, отображение памяти не работает непосредственно с символьными данными, поэтому вам придется рассматривать данные как 8-битные целые числа (класс uint8). Функция nt2int в Toolbox™ Биоинформатика может использоваться для преобразования символьной информации в целочисленные значения. int2nt используется для преобразования обратно в символы.
Сначала откройте файл FASTA и извлеките заголовок.
fidIn = fopen(FASTAfilename,'r');
header = fgetl(fidIn)
header =
'>1 dna:chromosome chromosome:GRCh37:1:1:249250621:1'
Откройте файл для сопоставления памяти.
[fullPath, filename, extension] = fileparts(FASTAfilename); mmFilename = [filename '.mm'] fidOut = fopen(mmFilename,'w');
mmFilename =
'Homo_sapiens.GRCh37.56.dna.chromosome.1.mm'
Прочитайте файл FASTA в блоках 1MB, удалите новые символы строки, преобразуйте его в uint8 и запишите в файл MM.
newLine = sprintf('\n'); blockSize = 2^20; while ~feof(fidIn) % Read in the data charData = fread(fidIn,blockSize,'*char')'; % Remove new lines charData = strrep(charData,newLine,''); % Convert to integers intData = nt2int(charData); % Write to the new file fwrite(fidOut,intData,'uint8'); end
Закройте файлы.
fclose(fidIn); fclose(fidOut);
Новый файл имеет тот же размер, что и старый, но не содержит новых строк или информации заголовка.
mmfileInfo = dir(mmFilename)
mmfileInfo =
struct with fields:
name: 'Homo_sapiens.GRCh37.56.dna.chromosome.1.mm'
folder: '/tmp/BR2021ad_1584584_202060/publish_examples0/tp07af436a/ex57563178'
date: '26-Jan-2021 19:40:46'
bytes: 249250621
isdir: 0
datenum: 7.3818e+05
Команда memmapfile создает объект memmapfile, который сопоставляет новый файл с памятью. Для этого необходимо знать формат файла. Формат этого файла прост, хотя могут быть отображены гораздо более сложные форматы.
chr1 = memmapfile(mmFilename, 'format', 'uint8')
chr1 =
Filename: '/tmp/BR2021ad_1584584_202060/publish_examples0/tp07af436a/ex57563178/Homo_sapiens.GRCh37.56.dna.chromosome.1.mm'
Writable: false
Offset: 0
Format: 'uint8'
Repeat: Inf
Data: 249250621x1 uint8 array
Объект memmapfile имеет различные свойства. Filename сохраняет полный путь к файлу. Writable указывает на возможность изменения данных. Обратите внимание, что при изменении данных исходный файл также будет изменен. Offset позволяет указать пространство, используемое любой информацией заголовка. Format указывает формат данных. Repeat используется для указания количества блоков (как определено Format) для отображения. Это может быть полезно для ограничения объема памяти, используемой для создания карты памяти. Доступ к этим свойствам возможен так же, как и к другим данным MATLAB. Дополнительные сведения см. в разделе Тип help memmapfile или doc memmapfile.
chr1.Data(1:10)
ans = 10x1 uint8 column vector 15 15 15 15 15 15 15 15 15 15
Доступ к любой области данных можно получить с помощью операций индексирования.
chr1.Data(10000000:10000010)'
ans = 1x11 uint8 row vector 1 1 2 2 2 2 3 4 2 4 2
Помните, что нуклеотидная информация была преобразована в целые числа. Вы можете использовать int2nt чтобы вернуть информацию о последовательности.
int2nt(chr1.Data(10000000:10000010)')
ans =
'AACCCCGTCTC'
Или использовать seqdisp для отображения последовательности.
seqdisp(chr1.Data(10000000:10001000)')
ans =
17x71 char array
' 1 AACCCCGTCT CTACAATAAA TTAAAATATT AGCTGGGCAT GGTGGTGTGT GCTTGTAGTC'
' 61 CCAGCTACTT GGCGGGCTGA GGTGGGAGAA TCATCCAAGC CTTGGAGGCA GAGGTTGCAG'
' 121 TGAGCTGAGA TTGTGACACT GCACTCCAGC CTGGGAGACA GAGTGAGACT CCTACTCAAA'
' 181 AAAAAACAAA AAACAAAAAA CAAACCACAA AACTTTCCAG GTAACTTATT AAAACATGTT'
' 241 TTTTGTTTGT TTTGAGACAG AGTCTTGCTC TGTCGCCCAG GCTGGAGTGC AGTGGAGCAA'
' 301 TCTCAGCTCA CTGCAAGCTC CGCCTCCCGG GTTCACACCA TTCTCCTGCC TCAGCCTCCC'
' 361 GAGTAGCTAG GACTATAGGC ACCCGCCACC ACGCCCAGCT TATTTTTTTT GTATTTTTTA'
' 421 GTAGAGACGG GGTTTCATCG TGTTAGCCAG GATGGTCTCG ATCTCCTGAC CTCGTGATCC'
' 481 GCCCACCTCA GCCTCCCAAA GTGCTGGGAT TACAGGCGTG AGCCACTGCA CCCGGCCTAG'
' 541 TTTTTGTATA TTTTTTTTAG TAGAGACAGG GTTTCACCAT GTTAGCCAGG ATGGTCTCAA'
' 601 TCTCCTGACC TCGTGATCCG CCCGCCTCGG CCTCCCAAAG TGCTGGGGTT ACAGGCGTGA'
' 661 GCCACCGCAC ACAGCATTAA AGCATGTTTT ATTTTCCTAC ACATAATGAA ATCATTACCA'
' 721 GATGATTTGA CATGTGTACT TCATTGGAGA GGATTCTTAC AGTATATTCA AAATTAAATA'
' 781 TAATGACAAA AAATTACTAC CTAATCTATT AAAATTGGCA TAAGTCATCT ATGATCATTA'
' 841 ATGATATGCA AACATAAACA AGTATTATAC CCAGAAGTGT AATTTATTGT AGCTACATCT'
' 901 TATGTATAAT AGTTTAGTGG ATTTTTCCTG GAAATTGTCC ATTTTAATTT TTCTCTTAAG'
' 961 TCTGTGGAAT TTTCCAGTAA AAGTCAAGGC AAACCCAAGA T '
Теперь, когда вы можете легко получить доступ ко всей хромосоме, вы можете проанализировать данные. Этот пример показывает один способ посмотреть на содержание GC вдоль хромосомы.
Вы извлекаете блоки 500000bp и вычисляете содержание GC.
Вычислите количество используемых блоков.
numNT = numel(chr1.Data); blockSize = 500000; numBlocks = floor(numNT/blockSize);
Одним из способов повышения производительности MATLAB при работе с большими наборами данных является «предварительное выделение» пространства для данных. Это позволяет MATLAB выделять достаточно места для всех данных, а не увеличивать массив небольшими порциями. Это ускорит процесс, а также защитит вас от проблем со слишком большим объемом данных для хранения. Дополнительные сведения о предварительном выделении массивов см. в разделе: http://www.mathworks.com/support/solutions/data/1-18150.html?solution=1-18150
Простым способом предварительного выделения массива является использование zeros функция.
ratio = zeros(numBlocks+1,1);
Закольцевать данные, ищущие C или G, а затем разделить это число на общее число A, T, C и G. Для запуска потребуется около минуты.
A = nt2int('A'); C = nt2int('C'); G = nt2int('G'); T = nt2int('T'); for count = 1:numBlocks % calculate the indices for the block start = 1 + blockSize*(count-1); stop = blockSize*count; % extract the block block = chr1.Data(start:stop); % find the GC and AT content gc = (sum(block == G | block == C)); at = (sum(block == A | block == T)); % calculate the ratio of GC to the total known nucleotides ratio(count) = gc/(gc+at); end
Конечный блок меньше, поэтому рассматривайте это как особый случай.
block = chr1.Data(stop+1:end); gc = (sum(block == G | block == C)); at = (sum(block == A | block == T)); ratio(end) = gc/(gc+at);
xAxis = [1:blockSize:numBlocks*blockSize, numNT]; plot(xAxis,ratio) xlabel('Base pairs'); ylabel('Relative GC content'); title('Relative GC content of Homo Sapiens Chromosome 1')

Область в центре участка вокруг 140Mbp - большая область Ns.
seqdisp(chr1.Data(140000000:140001000))
ans =
17x71 char array
' 1 NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN'
' 61 NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN'
' 121 NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN'
' 181 NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN'
' 241 NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN'
' 301 NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN'
' 361 NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN'
' 421 NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN'
' 481 NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN'
' 541 NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN'
' 601 NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN'
' 661 NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN'
' 721 NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN'
' 781 NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN'
' 841 NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN'
' 901 NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN'
' 961 NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN NNNNNNNNNN N '
Вы можете использовать find для идентификации областей с высоким содержанием GC.
indices = find(ratio>0.5);
ranges = [(1 + blockSize*(indices-1)), blockSize*indices];
fprintf('Region %d:%d has GC content %f\n',[ranges ,ratio(indices)]')
Region 500001:1000000 has GC content 0.501412 Region 1000001:1500000 has GC content 0.598332 Region 1500001:2000000 has GC content 0.539498 Region 2000001:2500000 has GC content 0.594508 Region 2500001:3000000 has GC content 0.568620 Region 3000001:3500000 has GC content 0.584572 Region 3500001:4000000 has GC content 0.548137 Region 6000001:6500000 has GC content 0.545072 Region 9000001:9500000 has GC content 0.506692 Region 10500001:11000000 has GC content 0.511386 Region 11500001:12000000 has GC content 0.519874 Region 16000001:16500000 has GC content 0.513082 Region 17500001:18000000 has GC content 0.513392 Region 21500001:22000000 has GC content 0.505598 Region 156000001:156500000 has GC content 0.504446 Region 156500001:157000000 has GC content 0.504090 Region 201000001:201500000 has GC content 0.502976 Region 228000001:228500000 has GC content 0.511946
Чтобы удалить временный файл, необходимо сначала очистить memmapfile объект.
clear chr1
delete(mmFilename)