python - 正在加载/流式传输 8GB txt 文件?并标记化

标签 python nltk file-read

我有一个相当大的文件(大约 8 GB)..现在我读了这篇文章:How to read a large file line by line还有这个Tokenizing large (>70MB) TXT file using Python NLTK. Concatenation & write data to stream errors

但这仍然不能完成工作..当我运行我的代码时,我的电脑卡住了。 我做错了什么吗?

我想将所有单词放入列表中(对它们进行标记)。此外,代码不是读取每一行并标记该行吗?这是否可能会阻止标记器正确标记单词,因为某些单词(和句子)不会在一行后结束?

我考虑过将其分割成更小的文件,但是如果我只有 8GB RAM,这是否仍然会消耗我的 RAM,因为单词列表可能与初始 txt 文件一样大(8GB)?

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)

最佳答案

通过使用以下行:

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

您正在强制 python 使用 t.readlines() 读取整个文件,然后返回代表整个文件的字符串数组,从而将整个文件放入内存中。

相反,如果您按照链接的示例进行操作:

for line in t:
    # do the things

Python VM 将按照您的意愿 native 逐行处理文件。 该文件的行为类似于 generator ,一次生成每一行。

<小时/>

再次查看您的代码后,我发现您不断使用 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.

请注意,它实际上从未将单词存储在任何地方。这并不意味着您不能临时存储任何内容,但如果您的内存有限,则可以使用生成器。这种方法可能会更快、更稳定,并且总体上使用更少的内存。

关于python - 正在加载/流式传输 8GB txt 文件?并标记化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57083223/

相关文章:

Python 和多线程

python - 如何对不同上下文的查询使用序列标签?

c# - 通过网络高效复制文件的算法

python - 更改文本文件的内容并制作具有相同格式的新文件

python - 在 Python 3.6 中使用 setdefault 使用来自两个不同文件的信息显示(名称、id 和频率计数)

python - 如何防止一个高度相关的变量淹没 scikit-learn 中的其余变量?

python - 导入 nltk 时 PyCharm 打印 'True'

java - Filereader.read() 方法不起作用

java - 如何从文件读取数据直到遇到空行

python - 在 jupyter 笔记本上显示 plotly