我有一个数据库,其中包含需要分析的原始文本。例如,我收集了数亿个网页的标题标签,并根据主题对它们进行了聚类。我现在有兴趣对每个主题集群的子集执行一些额外的测试。问题是双重的。首先,我不能将所有文本都放入内存来评估它。其次,我需要并行运行其中几个分析,所以即使我可以将一个子集放入内存中,我当然也无法将许多子集放入内存中。
我一直在使用生成器,但通常需要知道有关已加载和评估的数据行的信息。
我的问题是:处理和分析无法融入内存的数据的最佳方法是什么。必须从某种数据库中提取数据(目前是mysql,但很快就会转向更强大的解决方案。)
我正在构建用Python处理数据的软件。
谢谢,
修改
我将整天研究和集思广益,并计划继续发表我的想法和发现。请留下您可能有的任何意见或建议。
IDEA 1:标记单词和n-gram并保存到文件。 对于从数据库中提取的每个字符串,使用已存在文件中的标记进行标记。如果令牌不存在,请创建它。对于每个单词标记,从右到左组合,直到存在字符串中所有单词的单个表示。搜索包含减少的令牌以查找潜在匹配和相似性的现有列表(可以适合内存)。每个简化的令牌将包含指示令牌类别的标识符。如果发现缩减的令牌(由单词令牌组合创建的令牌)与感兴趣的令牌化字符串明确匹配,而不是直接匹配,则缩减的令牌将被分解为其对应物并且通过单词比较单词令牌 - 令牌到感兴趣的字符串。
我不知道是否已经存在可以执行此操作的库或模块,我也不确定从中获得多少好处。但是,我的优先事项是:1)节省内存,2)担心运行时。想法?
编辑2
Hadoop肯定会解决这个问题。我在python和hadoop中找到了一些关于自然语言处理的优秀资源。见下文:
感谢您的帮助!
答案 0 :(得分:3)
最好的地图缩减引擎是Hadoop,但它具有很高的学习曲线,需要很多节点才值得。如果这是一个小项目,您可以使用MongoDB,这是一个非常容易使用的数据库,并包含一个使用Javascript的内部地图缩减引擎。 map reduce框架非常简单易学,但缺少使用Hadoop在JDK中可以获得的所有工具。
警告:您只能在MongoDB的地图缩减引擎上一次运行一个地图缩减作业。这对于链接作业或中等数据集(<100GB)是好的,但它缺乏Hadoop的并行性。
答案 1 :(得分:0)
目前正在使用mysql,但很快就会转而使用更强大的解决方案。
请不要更糟糕的时间 - 对于大多数类型的任务,调整MySQL是最好的解决方案。
要处理大量数据,请使用iteratools或Build a Basic Python Iterator
关于如何迭代数据。这取决于你的算法。