首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >处理巨大的文本文件

处理巨大的文本文件
EN

Stack Overflow用户
提问于 2009-10-26 14:54:02
回答 10查看 4.5K关注 0票数 5

问题:我有一个巨大的原始文本文件(假设为3G),我需要查看文件中的每个单词,并发现一个单词在文件中出现了多少次。

我提出的解决方案:将巨大的文件拆分成多个文件,每个拆分的文件都会以排序的方式包含单词。例如,以"a“开头的所有单词都将存储在"_a.dic”文件中。因此,我们在任何时候都不会执行超过26个文件。

这个方法的问题是,

我可以使用流来读取文件,但希望使用线程来读取文件的某些部分。例如,使用一个单独的线程读取0-1024字节(至少有基于no的4-8个线程)。在盒子里有处理器)。这是可能的还是我在做梦?

有更好的方法吗?

注意:它应该是一个纯c++或基于C的解决方案。不允许使用数据库等。

EN

回答 10

Stack Overflow用户

回答已采纳

发布于 2009-10-26 15:08:10

你需要看看克尼汉和派克的“编程实践”,特别是第三章。

在C++中,使用基于字符串和计数的映射(std::map<string,size_t>,IIRC)。读取文件(一次--它太大了,不能读取不止一次),一边读一边把它分割成单词(对于“word”的某些定义),并在地图条目中增加您找到的每个单词的计数。

在C中,您必须自己创建映射。(或者找到大卫·汉森的“C接口和实现”。)

或者您可以使用Perl、Python或Awk (它们都有关联数组,相当于一个映射)。

票数 15
EN

Stack Overflow用户

发布于 2009-10-26 15:09:14

我不认为使用并行读取文件部分的多线程会有多大帮助。我希望这个应用程序绑定到硬盘的带宽和延迟,而不是实际的单词计数。这样的多线程版本执行起来可能会更糟,因为“准随机”文件访问通常比“线性文件”访问慢。

如果CPU在单线程版本中真的很忙,可能会加快速度。一个线程可以读取大量数据,并将它们放入容量有限的队列中。一组其他的工作线程可以在各自的块上操作并计算单词。计数工作线程完成后,您必须合并单词计数器。

票数 6
EN

Stack Overflow用户

发布于 2009-10-26 16:10:51

首先-决定保存单词的数据结构。

最明显的选择是地图。但是也许一个特瑞会更好地服务于你。在每个节点中,保存单词的计数。意思是,它只是一个单词的一部分。您可以使用流插入trie并读取基于字符的文件。

第二次多线程是还是不是?这个问题不容易回答。根据数据结构的大小以及并行化的方式,答案可能会有所不同。

  1. 单线程-前向和易于实现。
  2. 具有多个读取器线程和一个数据结构的多线程。然后您必须同步对数据结构的访问。在Trie中,您只需要锁定实际所在的节点,这样多个读取器就可以访问数据结构,而不受太多干扰。自平衡树可能有所不同,特别是当再平衡时。
  3. 多线程由多个读取器线程组成,每个线程都有自己的数据结构。每个线程在读取文件的一部分时都会构建自己的数据结构。每次完成后,结果必须合并(这应该是容易的)。

有一件事你必须考虑--你必须为每个线程找到一个单词边界来启动,但这不会造成很大的问题(例如,每个线程一直走到第一个单词边界,然后在那里开始,每个线程在结束时完成它正在处理的单词)。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1625299

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档