Почему grep отнимает столько времени? - PullRequest
2 голосов
/ 10 августа 2011

Я использую grep для подсчета количества вхождений строки "^ mj" в файле graph.tcl.Команда, которую я написал, довольно проста, и вы можете легко понять.

grep "^ mj" mjwork / run / graph.tcl |wc -l

Выводит 46625, но после ~45 min.Ребята, можете ли вы предложить лучший подход, который может сократить время?

Спасибо !!!

Ответы [ 2 ]

0 голосов
/ 05 сентября 2011

Вы должны попробовать эту маленькую программу на Си, которую я только что сделал минуту назад.

#define _FILE_OFFSET_BITS 64

#include <string.h>
#include <stdio.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <unistd.h>

const char needle[] = "mj";

int main(int argc, char * argv[]) {
  int fd, i, res, count;
  struct stat st;
  char * data;

  if (argc != 2) {
    fprintf(stderr, "Syntax: %s file\n", *argv);
    return 1;
  }

  fd = open(argv[1], O_RDONLY);
  if (fd < 0) {
    fprintf(stderr, "Couldn't open file \"%s\": %s\n", argv[1], strerror(errno));
    return 1;
  }

  res = fstat(fd, &st);
  if (res < 0) {
    fprintf(stderr, "Failed at fstat: %s\n", strerror(errno));
    return 1;
  }

  if (!S_ISREG(st.st_mode)) {
    fprintf(stderr, "File \"%s\" is not a regular file.\n", argv[1]);
    return 1;
  }

  data = mmap(NULL, st.st_size, PROT_READ, MAP_SHARED, fd, 0);
  if (!data) {
    fprintf(stderr, "mmap failed!: %s\n", strerror(errno));
    return 1;
  }

  count = 0;
  for (i = 0; i < st.st_size; i++) {
    // look for string:
    if (i + sizeof needle - 1 < st.st_size
    && !memcmp(data + i, needle, sizeof needle - 1)) {
      count++;
      i += sizeof needle - 1;
    }
    while (data[i] != '\n' && i < st.st_size)
      i++;
  }

  printf("%d\n", count);

  return 0;
}

Скомпилируйте это с: gcc grepmj.c -o grepmj -O2

0 голосов
/ 10 августа 2011

Похоже, что-то не так с вашей машиной.Достаточно ли у вас места подкачки и т. Д.?Что показывает df -h?В качестве теста попробуйте egrep или fgrep в качестве альтернативы grep.

...