Оптимизировать время выполнения сопоставления с образцом - PullRequest
1 голос
/ 21 февраля 2020

Представьте, что у вас есть два списка, первый из которых состоит из 700 слов, а второй - из 30 000 возможных предложений. Будет 21 000 000 комбинаций начала предложения и слова.

Кроме того, существует около 400 файлов с некоторыми результатами для каждого возможного сочетания предложения и слова. Каждый файл состоит из 170 000 000 строк и имеет следующую структуру:

this is the first sentence
    1. result for that sentence
    2. result for that sentence
    ...
    nth result for that sentence

this is the second sentence
    ...

this is the nth sentence
    ...

Для каждого возможного предложения + словосочетание я хотел бы найти файл результатов, содержащий некоторую информацию о комбинации (для каждой комбинации есть только один файл результатов, в котором происходит комбинация) и считайте результаты. Вы можете сделать это в течение l oop:

all_results = []

#create combinations
for sentence in sentencelist:
    for word in wordlist:
        combo = str(sentence + ' ' + word)

        #loop through results file while no result for combination has bin found
        c_result = []
        while not c_result:
            for resultsfilename in os.listdir(resultsdirectory):
                with open(resultsfilename, 'r') as infile:
                    results = infile.read().splitlines()
                if combo in results:
                    c_result = function_to_find_pattern_based_on_continuation(continuation, results)

        #append results and reset c_result
        all_results.append(c_result)
        c_result = []

Однако этот алгоритм имеет довольно продолжительное время работы, и мне интересно, как его можно улучшить. Например, мне интересно, как я мог предотвратить загрузку файлов результатов снова и снова. Кроме того, я хотел бы создать копию файлов результатов, и после того, как результаты предложения + словосочетания будут считаны из файла результатов, они могут быть удалены в копии (я не хочу менять файлы на привод). Однако каждый файл результатов имеет размер около 7 ГБ, поэтому не имеет смысла хранить каждый файл в переменной, верно?

Есть ли другие вещи, которые можно использовать для улучшения времени выполнения?

Edit1: Адаптирован размер списков. Edit2: Добавить в то время как l oop и комментарии в коде

1 Ответ

1 голос
/ 21 февраля 2020

У вас есть 2 проблемы, насколько я понимаю.

  1. вам нужен какой-то способ уменьшить количество операций ввода-вывода для нескольких больших файлов.
  2. вам нужен способ изменить / скопировать некоторые из этих больших файлов

Я думаю, что есть несколько способов решить эти проблемы. Во-первых, если это возможно, я бы использовал базу данных, такую ​​как sqlite - это избавит вас от многих проблем с открытием / закрытием файла.

Во-вторых, вы можете использовать оператор pythons yield в вашем для l oop (поместить его в свою собственную функцию), а затем перебирать его как генератор и редактировать его как поток, как вы go. Это позволит вам сохранить результаты (скажем, в файле), не помещая их все в список, который будет звучать очень быстро из-за его звучания.

...