Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Удаление дубликатов и удаление строк из файлов, алгоритмы 
:(
    Опции темы
lamber
Дата 26.1.2011, 19:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 143
Регистрация: 20.12.2008

Репутация: нет
Всего: нет



Снова здравствуйте, стоит вот такая вот задача, все бы нечего если бы объёмы файлов ООочень большие от 10кк до 100кк записей. Нужно удалить дубликаты строк в файле, это первая задача, вторая задача сделать выборку из больших файлов по заданной строке, НО нужно удалить еще выбранные строки из файлов. Надеюсь на вашу помощь.
PM MAIL   Вверх
azesmcar
Дата 26.1.2011, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(lamber @  26.1.2011,  19:48 Найти цитируемый пост)
Нужно удалить дубликаты строк в файле

Читать построчно, подсчитать MD5 и хранить в каком нибудь контейнере типа std::set. Не повторяющиеся записать в другой файл. Все.

Цитата(lamber @  26.1.2011,  19:48 Найти цитируемый пост)
сделать выборку из больших файлов по заданной строке, НО нужно удалить еще выбранные строки из файлов

строки из файлов не удаляются, надо записать новый файл без этих строк.
PM   Вверх
lamber
Дата 26.1.2011, 22:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 143
Регистрация: 20.12.2008

Репутация: нет
Всего: нет



2azesmcar
а зачем считать md5 :?

окей а как записать в тот же файл, перенести весь файл в оперативу а потом перезаписать или создавать временный файл оригинал удалять, а потом переименновывать временный :?

Это сообщение отредактировал(а) lamber - 26.1.2011, 22:05
PM MAIL   Вверх
azesmcar
Дата 27.1.2011, 06:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(lamber @  26.1.2011,  22:01 Найти цитируемый пост)
а зачем считать md5 :?

Для экономии памяти. MD5 в бинарном виде 16 байтов, в текстовом - 32. Теоретически твоя строка может состоять из сотни символов.

Цитата(lamber @  26.1.2011,  22:01 Найти цитируемый пост)
окей а как записать в тот же файл, перенести весь файл в оперативу а потом перезаписать или создавать временный файл оригинал удалять, а потом переименновывать временный :?

создавать временный файл оригинал удалять, а потом переименновывать временный smile 
PM   Вверх
lamber
Дата 27.1.2011, 17:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 143
Регистрация: 20.12.2008

Репутация: нет
Всего: нет



отчитываюсь по результатам, использовал контейнер set удобная штука, но есть проблема может кто слышал про тулзу KeyWordKeeper.exe достаточно удобная штука, вот я решил сравнить работу своей проги использующей stl set просеяв строки на уникальность и её в итоге 244мб файл прога порезала всего на 14 метров, а моя прога укаратила его аж на 160мб, я конечно рад бы думать что у меня-то на самом деле как нужно, но реалии обвчно говрорят обратное, может есть какая-то не учтенная мною особенность контейнера.

2azesmcar я не реализовывал md5 от строки т.к. это сложновато для меня реализовать, ну а тянуть либу Crypto++ и разбираться  ней желания не было (хотя если выяснится что без этого ни как то я что поделаешь).
PM MAIL   Вверх
azesmcar
Дата 27.1.2011, 18:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(lamber @  27.1.2011,  17:24 Найти цитируемый пост)
2azesmcar я не реализовывал md5 от строки т.к. это сложновато для меня реализовать, ну а тянуть либу Crypto++ и разбираться  ней желания не было (хотя если выяснится что без этого ни как то я что поделаешь). 

ты хранишь в set всю строку, оттого и такой расход памяти. А тянуть ничего не надо, в интернете полно реализаций md5, выбирай любую.
http://stackoverflow.com/questions/1220046...-hash-of-a-file

Это сообщение отредактировал(а) azesmcar - 27.1.2011, 18:04
PM   Вверх
lamber
Дата 27.1.2011, 19:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 143
Регистрация: 20.12.2008

Репутация: нет
Всего: нет



Столько сам файл занимает, я больше переживают за то почему при использовании set<string> столько якобы дубликатов удаляет. Прогоняя тот же файл софтом который на этом специализируется получаю совершенно разные результаты.
PM MAIL   Вверх
azesmcar
Дата 27.1.2011, 20:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(lamber @  27.1.2011,  19:47 Найти цитируемый пост)
Столько сам файл занимает, я больше переживают за то почему при использовании set<string> столько якобы дубликатов удаляет. Прогоняя тот же файл софтом который на этом специализируется получаю совершенно разные результаты. 

покажи исходники, чего гадать?
PM   Вверх
lamber
Дата 28.1.2011, 11:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 143
Регистрация: 20.12.2008

Репутация: нет
Всего: нет



Код

    int count=0;
    strcpy(result.filename,filename);    
    string line;
    string temp;
    char outname[256];
    char buff[1024];
    string buffer;
    set<string> setbuffer;
    buffer=GetFileName(filename);
    sprintf(outname,"parsed_%s",buffer.c_str());
    size_t nPos;
    buffer.clear();
    ifstream infile(filename,ios_base::in);
    while (getline(infile, line,'\r'))
  {
      count++;
      result.lines++;
      nPos=line.find(":");      
      if(nPos!=string::npos)
      {
          temp=explode(line);
          setbuffer.insert(temp+'\n');

      }else
          setbuffer.insert(temp+'\n');
      if(count>204800)
      {
          count=0;
          wsprintfA(buff,"file parsed:%s\nlines parsed: %d",result.filename,result.lines);
          SetWindowTextA(GetDlgItem(thwnd,IDTEXT),buff);
      }
    
  }
          if(setbuffer.size()>0)
          {
          SaveToFile("blackhole.txt",setbuffer);
          wsprintfA(buff,"file parsed:%s\nlines parsed: %d",result.filename,result.lines);
          SetWindowTextA(GetDlgItem(thwnd,IDTEXT),buff);
          setbuffer.clear();
          }         
          return result;
}

PM MAIL   Вверх
azesmcar
Дата 28.1.2011, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



lamber

Как все запутанно smile 
Код

std::string md5(const std::string& line)
{
    return /* md5 implementation goes here */ line;
}

int main()
{
    std::ifstream inp("d:\\1.txt");
    std::ofstream out("d:\\2.txt");

    std::set<std::string> lines;

    for (std::string temp; std::getline(inp, temp);)
    {
        if (lines.insert(md5(temp)).second)
        {
            out << temp << '\n';
        }
    }
    out.close();
    inp.close();
}

PM   Вверх
jonie
Дата 29.1.2011, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 15
Всего: 118



azesmcar, md5 слишком круто имхо для решения подобной задачи... кроме того даже она не обеспечивает истинности сравнения строк... тогда уж имхо хранить {хеш, длина, начальное смещение} и проверять соотвественно сначала хеш на уникальность, потом длину, потом побайтам ...


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
azesmcar
Дата 29.1.2011, 17:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(jonie @  29.1.2011,  13:00 Найти цитируемый пост)
md5 слишком круто имхо для решения подобной задачи

В каком смысле крут? В принципе можно и что нибудь попроще, но md5 дает хорошое распределение.

Цитата(jonie @  29.1.2011,  13:00 Найти цитируемый пост)
кроме того даже она не обеспечивает истинности сравнения строк

 smile 
этого не может обеспечить ни один хэш, тем не менее для более менее коротких строк md5 достаточно уникален, чтобы на него можно было положиться во многих ситуациях.

Цитата(jonie @  29.1.2011,  13:00 Найти цитируемый пост)
тогда уж имхо хранить {хеш, длина, начальное смещение} и проверять соотвественно сначала хеш на уникальность, потом длину, потом побайтам ... 

Да, конечно это замедлит процесс, в особенности если повторяющихся значений много, но если удаление НЕ эквивалентных строк в одном случае из миллионов - это катастрофа, то так и надо поступить.  smile 
PM   Вверх
jonie
Дата 29.1.2011, 19:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 15
Всего: 118



Цитата(azesmcar @  29.1.2011,  17:15 Найти цитируемый пост)

Да, конечно это замедлит процесс, в особенности если повторяющихся значений много, но если удаление НЕ эквивалентных строк в одном случае из миллионов - это катастрофа, то так и надо поступить.  smile  

не то чтобы сильно замедлит, если заменить md5 на что-то более быстрое. http://code.google.com/p/google-sparsehash/ вот какой-то хеш, говорят неплох по скорости...



--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
azesmcar
Дата 29.1.2011, 19:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(jonie @  29.1.2011,  19:07 Найти цитируемый пост)
не то чтобы сильно замедлит, если заменить md5 на что-то более быстрое. http://code.google.com/p/google-sparsehash/ вот какой-то хеш, говорят неплох по скорости...

Ну замедление будет не за счет хеша, а за счет повторного чтения и сравнения самих строк. Поскольку этот процесс будет происходить только для повторов, то это будет скорее чувствоваться при большом множестве повторений.
Цитата(jonie @  29.1.2011,  19:07 Найти цитируемый пост)
вот какой-то хеш, говорят неплох по скорости...

А есть какие-то про распределение (distribution), я что-то ничего не нашел.
PM   Вверх
sQu1rr
Дата 30.1.2011, 01:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 597
Регистрация: 11.11.2008
Где: london

Репутация: 3
Всего: 13



Цитата(azesmcar @  29.1.2011,  17:15 Найти цитируемый пост)

Да, конечно это замедлит процесс, в особенности если повторяющихся значений много, но если удаление НЕ эквивалентных строк в одном случае из миллионов - это катастрофа, то так и надо поступить.    

Если такой случай один на миллион то и замедлится процесс в одну миллионную раза smile
PM MAIL Skype GTalk   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1212 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.