Я написал приложение, которое обрабатывает данные на графическом процессоре. Код работает хорошо, но у меня проблема в том, что часть чтения входного файла (~ 3 ГБ, текст) является узким местом моего приложения. . (Чтение с жесткого диска происходит быстро, но обработка строка за строкой происходит медленно.)
Я читаю строку с помощью getline () и копирую строку 1 в вектор, строку 2 в вектор и пропускаю строки 3 и 4. И так далее для остальных 11 миллионов строк.
Я пробовал несколько подходов, чтобы получить файл в наилучшее возможное время:
Самый быстрый метод, который я нашел, - это использование boost :: iostreams :: stream
Другие были :
Есть предложения, как заставить его работать быстрее?
void readfastq(char *filename, int SRlength, uint32_t blocksize){
_filelength = 0; //total datasets (each 4 lines)
_SRlength = SRlength; //length of the 2. line
_blocksize = blocksize;
boost::iostreams::streamins(filename);
in = ins;
readNextBlock();
}
void readNextBlock() {
timeval start, end;
gettimeofday(&start, 0);
string name;
string seqtemp;
string garbage;
string phredtemp;
_seqs.empty();
_phred.empty();
_names.empty();
_filelength = 0;
//read only a part of the file i.e the first 4mio lines
while (std::getline(in, name) && _filelength<_blocksize) {
std::getline(in, seqtemp);
std::getline(in, garbage);
std::getline(in, phredtemp);
if (seqtemp.size() != _SRlength) {
if (seqtemp.size() != 0)
printf("Error on read in fastq: size is invalid\n");
} else {
_names.push_back(name);
for (int k = 0; k < _SRlength; k++) {
//handle special letters
if(seqtemp[k]== 'A') ...
else{
_seqs.push_back(5);
}
}
_filelength++;
}
}
РЕДАКТИРОВАТЬ:
Исходный файл можно загрузить в https: // docs. google.com/open?id=0B5bvyb427McSMjM2YWQwM2YtZGU2Mi00OGVmLThkOD AtYzJhODIzYjNhYTY2
Я изменил функцию readfastq для чтения файла из-за некоторых проблем с указателем. Поэтому, если вы вызываете readfastq
, размер блока
(в строках) должен быть больше, чем количество строк для чтения.
РЕШЕНИЕ:
Я нашел решение, которое позволяет получить время чтения в файле с 60 до 16 секунд.Я удалил внутренний цикл, который обрабатывает специальные символы, и сделал это в графическом процессоре. Это уменьшает время чтения и лишь минимально увеличивает время работы графического процессора.
Спасибо за ваши предложения.
void readfastq(char *filename, int SRlength) {
_filelength = 0;
_SRlength = SRlength;
size_t bytes_read, bytes_expected;
FILE *fp;
fp = fopen(filename, "r");
fseek(fp, 0L, SEEK_END); //go to the end of file
bytes_expected = ftell(fp); //get filesize
fseek(fp, 0L, SEEK_SET); //go to the begining of the file
fclose(fp);
if ((_seqarray = (char *) malloc(bytes_expected/2)) == NULL) //allocate space for file
err(EX_OSERR, "data malloc");
string name;
string seqtemp;
string garbage;
string phredtemp;
boost::iostreams::streamfile(filename);
while (std::getline(file, name)) {
std::getline(file, seqtemp);
std::getline(file, garbage);
std::getline(file, phredtemp);
if (seqtemp.size() != SRlength) {
if (seqtemp.size() != 0)
printf("Error on read in fastq: size is invalid\n");
} else {
_names.push_back(name);
strncpy( &(_seqarray[SRlength*_filelength]), seqtemp.c_str(), seqtemp.length()); //do not handle special letters here, do on GPU
_filelength++;
}
}
}