python - 处理内存中的大量文本数据
问题描述
我正在尝试在具有 64 GB RAM 的 Ubuntu 系统上处理约 20 GB 的数据。
此步骤是生成用于训练 ML 算法的特征向量的一些预处理步骤的一部分。
最初的实现(由我团队中的某个人编写)中有列表。随着我们添加更多的训练数据,它不能很好地扩展。是这样的。
all_files = glob("./Data/*.*")
file_ls = []
for fi in tqdm(all_files):
with open(file=fi, mode="r", encoding='utf-8', errors='ignore') as f:
file_ls.append(f.read())
这会遇到内存错误(进程被杀死)。所以我虽然我应该尝试用尝试替换基于列表的东西
def insert(word):
cur_node = trie_root
for letter in word:
if letter in cur_node:
cur_node = cur_node[letter]
else:
cur_node[letter] = {}
cur_node = cur_node[letter]
cur_node[None] = None
trie_root = {}
for fi in tqdm(all_files):
with open(file=fi, mode="r", encoding='utf-8', errors='ignore') as f:
insert(f.read().split())
这也被杀了。以上是我为捕获对象的内存占用而编写的演示代码。更糟糕的是 list 的演示代码独立运行,但 trie 的演示代码被杀死,让我相信这个实现比 list 实现更糟糕。
我的目标是用 Python 编写一些高效的代码来解决这个问题。
请帮我解决这个问题。
编辑:响应@Paul Hankin,数据处理包括首先占用每个文件并为标准化术语频率大于0.01的术语添加一个通用占位符,然后将每个文件拆分为一个列表并计算一个词汇表,将所有处理过的文件考虑在内。
解决方案
这个问题的简单解决方案之一可能是不在列表或任何数据结构中存储数据。您可以在读取时尝试将这些数据写入文件。
推荐阅读
- python - 芹菜块任务从不重试
- javascript - IntelliJ REST 客户端中的 JavaScript
- html - 如何在 HTML 中对无序列表上的编号列表索引进行排序和重新索引?
- python - 有没有办法从 Python 中的 P/ACF 图中提取点?
- python - 为什么我不能从“selenium.webdriver.support.ui”导入名称“Web”?
- flutter - Dart/Flutter:Firebase 和 Firestore 等待异步 for 循环完成,然后再继续
- c# - 在c#中返回与类相同类型的对象?
- python - 如何在一列数据框中实现 groupby?
- three.js - 仅使用 ThreeJS 构建没有 HTML DOM 覆盖的交互式 UI 的最佳方法
- javascript - 如何使用 vanilla js 显示输入值?