- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个我无法解决的问题。我有 4 个 .txt
文件,每个文件都在 30-70GB 之间。每个文件包含如下 n-gram 条目:
blabla1/blabla2/blabla3
word1/word2/word3
...
我想做的是计算每个项目出现的次数,并将这些数据保存到一个新文件中,例如:
blabla1/blabla2/blabla3 : 1
word1/word2/word3 : 3
...
到目前为止,我的尝试只是将所有条目保存在字典中并对其进行计数,即
entry_count_dict = defaultdict(int)
with open(file) as f:
for line in f:
entry_count_dict[line] += 1
但是,使用这种方法我遇到了内存错误(我有 8GB RAM 可用)。数据遵循 zipfian 分布,例如大多数项目只出现一次或两次。条目总数尚不清楚,但(非常)粗略估计总共有大约 15,000,000 个条目。
除此之外,我还尝试了 h5py
,其中所有条目都保存为包含数组 [1]
的 h5py 数据集,然后对其进行更新,例如:
import h5py
import numpy as np
entry_count_dict = h5py.File(filename)
with open(file) as f:
for line in f:
if line in entry_count_dict:
entry_count_file[line][0] += 1
else:
entry_count_file.create_dataset(line,
data=np.array([1]),
compression="lzf")
但是,这种方法很慢。写入速度越来越慢。因此,除非可以提高写入速度,否则这种方法是不可信的。此外,按 block 处理数据并为每个 block 打开/关闭 h5py 文件在处理速度上没有显示出任何显着差异。
我一直在考虑将以某些字母开头的条目保存在单独的文件中,即所有以 a
开头的条目都保存在 a.txt
中,并且依此类推(这应该可以使用 defaultdic(int)
)。然而,要做到这一点,文件必须为每个字母迭代一次,考虑到文件大小(最大 = 69GB),这是难以置信的。也许在遍历文件时,可以打开 pickle 并将条目保存在字典中,然后关闭 pickle。但是,由于打开、加载和关闭 pickle 文件需要时间,对每个项目执行此操作会大大减慢该过程。
解决此问题的一种方法是在一次传递中对所有条目进行排序,然后遍历排序后的文件并按字母顺序对条目进行计数。然而,即使使用 linux 命令对文件进行排序也非常慢:
排序文件.txt > sorted_file.txt
而且,我真的不知道如何使用 python 解决这个问题,因为将整个文件加载到内存中进行排序会导致内存错误。我对不同的排序算法有一些肤浅的了解,但是它们似乎都要求将要排序的整个对象加载到内存中。
任何有关如何处理此问题的提示都将不胜感激。
最佳答案
有许多算法可以执行此类操作。它们都属于 External Sorting 的总标题。 .
您在那里所做的“将以特定字母开头的条目保存在单独的文件中”实际上称为桶排序,理论上应该更快。尝试使用切片数据集。
或者,尝试 Dask ,一个 DARPA + Anaconda 支持的分布式计算库,具有 numpy、pandas 熟悉的接口(interface),并且像 Apache-Spark 一样工作。 (也适用于单机)顺便说一句,它可以扩展
我建议尝试 dask.array,它将大数组切割成许多小数组,并使用阻塞算法实现 numpy ndarray 接口(interface),以在计算这些大于内存的数据时利用所有内核。
关于python - 海量数据汇总,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51132716/
“大规模”的微型 ORM 是否有处理继承的方法? robconery / massive 为 Massive 编写提供程序很难吗? 我需要非常接近 SQL Server 的东西。作为第一步,最好拦截
我编写了一个服务器可以使用的应用程序。此应用程序收集信息,并将其发送到服务器。每 10 秒执行一次。数据量取决于玩游戏的玩家,但让我们将其保持在大约 50 个服务器,每个服务器发送 100 条数据(每
我有一个表,其中包含 3 个字段(用户名、目标值、分数),由用户名 (~400,000) 和目标值 (~4000) 的完整交叉在外部生成,并计算出分数,导致总行数约为 16 亿. 我在这个表上的所有查
我们包括了这个 AndroidPdfViewer library支持在应用程序中查看 PDF 报告。它导致 APK 大小从 4.7Mb 大幅增加到 20.1Mb。 有没有办法减小这个尺寸。让我知道在哪
我在脑海中争论是否应该在 MySQL 中使用大量的多维数组或数据库。我正在为一个业务有很多产品的客户开发。在这个多维数组中,我将包括每个产品的产品标题、描述、图片链接和类别。 我的客户可能有 1000
我是一名优秀的程序员,十分优秀!