Загрузка / потоковая передача txt-файла размером 8 ГБ ?? И токенизировать

У меня довольно большой файл (около 8 ГБ) ... теперь я читаю этот пост: Как читать большой файл построчно и этот Токенизация больших (›70 МБ ) TXT-файл с использованием Python NLTK. Объединение и запись данных в поток ошибок

Но это все еще не работает ... когда я запускаю свой код, мой компьютер зависает. Я делаю что-то неправильно?

Я хочу собрать все слова в список (разметить их). Кроме того, разве код не читает каждую строку и не токенизирует ее? Разве это не может помешать токенизатору правильно размечать слова, поскольку некоторые слова (и предложения) не заканчиваются после одной строки?

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

word_list=[]
number = 0
with open(os.path.join(save_path, 'alldata.txt'), 'rb',encoding="utf-8") as t:
    for line in t.readlines():
        word_list+=nltk.word_tokenize(line)
        number = number + 1
        print(number)

person Felix    schedule 17.07.2019    source источник
comment
См. github.com/nltk/nltk/pull/2337 =)   -  person alvas    schedule 18.07.2019


Ответы (1)


Используя следующую строку:

for line in t.readlines():
    # do the things

Вы заставляете python читать весь файл с помощью t.readlines(), а затем возвращать массив строк, представляющий весь файл, таким образом, весь файл помещается в память.

Вместо этого, если вы сделаете в качестве примера, который вы связали, говорится:

for line in t:
    # do the things

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


Посмотрев снова на ваш код, я вижу, что вы постоянно добавляете в список слов с помощью word_list += nltk.word_tokenize(line). Это означает, что даже если вы импортируете файл по одной строке за раз, вы все равно сохраняете эти данные в своей памяти, даже после того, как файл переместился. Вероятно, вам нужно будет найти лучший способ сделать что бы это ни было, поскольку вы по-прежнему будете потреблять огромные объемы памяти, потому что данные не были удалены из памяти.


Для таких больших данных вам придется либо

  • найти способ сохранить промежуточную версию ваших токенизированных данных или
  • спроектируйте свой код таким образом, чтобы вы могли обрабатывать одно или несколько токенизированных слов за раз.

Что-то вроде этого может помочь:

def enumerated_tokens(filepath):
    index = 0
    with open(filepath, rb, encoding="utf-8") as t:
        for line in t:
            for word in nltk.word_tokenize(line):
                yield (index, word)
                index += 1

for index, word in enumerated_tokens(os.path.join(save_path, 'alldata.txt')):
    print(index, word)
    # Do the thing with your word.

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

person David Culbreth    schedule 17.07.2019
comment
Хорошо, я понимаю ... для файлов такого размера список слов не может быть сохранен в памяти компьютера. Мне нужно записать их в дополнительный файл и передать слова через генератор. Поэтому для дальнейшего анализа мне нужно перезагрузить файл, перебрать его (опять же, если это не было сделано в первый раз) и сохранить в (другом) файле. - Итак, на всякий случай, если мне нужно пронумеровать каждое предложение (а предложение вряд ли закончится после строки), как мне прочитать файл до точки (.) Или чего-то не произойдет? - person Felix; 17.07.2019
comment
Подход, который я предложил выше, по-прежнему использует только исходный файл и создает генератор из строк исходного файла, который можно использовать для независимой обработки каждого слова. Однако, если вам нужно иметь все слова в списке одновременно, вам, вероятно, потребуется создать файл, который будет (более легко анализируемым) списком этих слов, прежде чем вы сделаете остальную часть своего обработка. - person David Culbreth; 17.07.2019