парсинг больших объемов данных
От: sinmaster  
Дата: 08.09.10 12:47
Оценка:
привет!
прошу подсказать как можно улучшить следующий код для обработки здоровенного 30GB текстового файла со строками.
требуется:
a) удалить в файле символ "|"
б) удалить все до первой открытой скобки "<"
в) удалить в конце файла всё что начинается на символ "-"
г) удалить в кажд строке пробелы в начале и в конце
д) удалить пустые строки
е) присоединить в конец кажд строки символ '."

как я это пока себе представляю:
def process(lines):
    dataStr = "".join(lines)

    # remove | globally
    p = re.compile(r'\|')
    dataStr = p.sub("", dataStr)

    # fix header
    p = re.compile(r'^[^<]*')
    dataStr = p.sub("", dataStr)

    #fix footer
    p = re.compile('-*$')
    dataStr = p.sub("", dataStr)

    # delete BOTH leading and trailing whitespace from each line
    #TODO: do better
    data  =dataStr.split('\n')

    #remove empty lines
    data = list(filter(lambda x: len(x) > 0, data))

    #append ending . to each line
    data = [l.strip() + '.' for l in data]

    return data

if __name__ == "__main__":
    if len(sys.argv) != 2:
        print "usage: %s %s" % (sys.argv[0], "dump.txt")
        exit(-1)
    else:
        fname = sys.argv[1]
        with open(fname, "r+") as file:

            data = list()
            i = 0
            while True:
                if i >= 100000:
                    result = process(data)
                    #TODO: append result to output file
                    i = 0
                    data = list()
                else:
                    line = file.readline()
                    if not line:
                        if data:
                            result = process(data)
                            #TODO: append result to output file
                        break
                    data.append(line)
                    i += 1

т.е. читаю в список по сто тыщ строк, и обрабатываю их, записываю в выходной файл. и так пока не кончатся данные все из исходного файла.
смущает явные излишние "кувыркания" данных в ф-ции "process" и назад: list_of_strings <--> string. как сделать лаконичней, а самое главное, быстрее по времени исполнения? спасибо!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.