Здравствуйте Boroda, Вы писали:
P>>Вот какая проблема — есть файл(порядка 1.5 мега, но это небольшой еще) из него нужно выбрать только те сиволы, которые принадлежат — atgc
P>>но изначально, там есть разная дополнительная информация+форматирование+цифры
P>>как из всего этого безобразия взять только символы из того алфавита?
{skipped}
Во-первых, acgt — это не нуклеотиды ли?
Во-вторых. Самые тормоза — в строчке
body += clearedData
Что требует перевыделения памяти.
Как существенно ускорить процесс.
1) выделять выходной буфер по-блочно. можно просто писать в write-only поток.
2) читать файл по-блочно (или вообще отобразить его в память).
С многопоточностью, imho, лучше не заморачиваться — накладные расходы на синхронизацию (на однопроцессорной машине).
3) переписать switch:
int alpha = -1; // индекс буквы в алфавите
switch(read_letter())
{
case 'a': case 'A': alpha = 0; break;
case 'c': case 'C': alpha = 1; break;
case 'g': case 'G': alpha = 2; break;
case 't': case 'T': alpha = 3; break;
}
if(alpha < 0) // не то что надо
continue;
m_iCount[alpha]++; // счетчики по алфавиту
static const char letters[] = "acgt"; // алфавит в lower-case
write_letter( letters[alpha] );
где псевдофункции read_letter & write_letter могут быть реализованы как вам угодно.
---
Если файл можно зачитать в память одним махом, то чтение-запись делается так (напр.)
char* buffer;
unsigned bufsize;
read_file(&buffer, &bufsize);
const char* reader = buffer;
const char* writer = buffer;
unsigned remains = bufsize;
while(remains)
{
char letter = *(reader++); remains--;
int alpha = -1;
switch(letter)
{
case 'A': letter = 'a'; // заодно переведем в lowercase
case 'a': alpha = 0;
break;
// аналогично остальные
}
m_iCounts[alpha]++;
// запись
*(writer++) = letter;
}
write_file(buffer, (writer-buffer));
read_file & write_file — это может быть чтение файла или его маппирование — на усмотрение.