Re[2]: как быстро файл проверить на правильность символов
От: Кодт Россия  
Дата: 03.04.02 08:23
Оценка:
Здравствуйте 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 — это может быть чтение файла или его маппирование — на усмотрение.
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.