Как вы можете манипулировать большими файлами быстрее в Python? - PullRequest
1 голос
/ 10 марта 2019

Мне нужно перебрать 30 ГБ файлов (их 30), а 500 МБ занимает около 15 минут. Как я могу оптимизировать производительность, зная, что я циклически перебираю каждую строку?

Python

import json
import os

def file_subreddit_comments(rfname,wfname):
    with open(rfname, 'r', encoding="utf8") as rf:
        with open(wfname, 'w', encoding="utf-8") as wf:
            for i, l in enumerate(rf):
                d = json.loads(l)
                link_id = d["link_id"]
                for lsi in list_submission_id:
                    constructed_link_id = "t3_" + lsi
                    if link_id == constructed_link_id:
                        wf.write(l)                    

defaultFilePath = r'D:\Users\Jonathan\Desktop\Reddit Data\Run Comments\\'
directory = os.fsencode(defaultFilePath)

list_submission_id = []
submission_id_file = r'D:\Users\Jonathan\Desktop\Reddit Data\Manipulated Data-09-03-19-Final\UniqueIDSubmissionsList-09-03-2019.txt'
with open(submission_id_file, "r", encoding="utf8") as sif:
    for i, l in enumerate(sif):
        list_submission_id.append(l.rstrip())

for file in os.listdir(directory):
     filename = os.fsdecode(file)
     comment_path_read = defaultFilePath + filename
     comment_path_save = defaultFilePath + filename + "_ext_com.txt"
     file_subreddit_comments(comment_path_read,comment_path_save)     
     print(filename)

submission_id_file - это список, содержащий около 1000 ключевых слов, и каждый из них должен проверять, находится ли значение constructured_link_id в списке.

Ответы [ 2 ]

1 голос
/ 15 марта 2019

Многопоточность и многопроцессорность могут быть решением, предложенным Томом выше.Ну, по крайней мере, это сократило время выполнения моих задач.12 ядер = 12 файлов, обрабатываемых одновременно.

0 голосов
/ 15 марта 2019

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

Я не могу быть на 100% уверен, что это проблема, это просто теория. Легко попробовать, хотя.

РЕДАКТИРОВАТЬ: только что заметил еще одно большое ускорение.

сделать вместо list_submission_id набор

list_submission_id = set()
list_submission_id.add("t3_" + l.rstrip())

Затем проверьте членство, используя:

link_id = d["link_id"]
if link_id in list_submission_id :
    wf.write(l)      

В отличие от моего другого предложения, это определенно БУДЕТ значительно ускорить процесс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...