Java-解析大型文本文件

问题描述:

我有一个快速问题。我正在开展一个学校项目,我需要解析一个非常大的文本文件。这是针对数据库类的,所以我需要从文件中获取唯一的actor名称,因为actor将成为mysql数据库中的主键。我已经写了解析器,它的工作很好,但当时我忘记删除重复。所以,我决定最简单的方法是创建一个演员arraylist。 (使用ArrayList ADT)然后使用contains()方法检查演员名称是否在数组列表中,然后将其打印到新的文本文件中。如果是我什么都不做,如果不是,我将它添加到数组列表并打印到页面。现在程序运行速度非常慢。在阵列列表之前,花了大约5分钟。旧的演员文件是180K没有删除重复。现在它已经运行了30分钟,到目前为止已经达到了12K。 (我期待100K-150K总这一次。)Java-解析大型文本文件

我留为空白,因为我不知道有多少演员都是在文件中的数组列表的大小,但至少1-2万元。我正考虑将500万美元的尺寸放入其中,并检查一下它是否全部结束。 (简单地检查最后一个数组列表索引,如果它是空的,它没有用完空间。)这是否会缩短时间,因为数组列表不会不断增加并重新复制所有内容?还有另一种方法会比这更快吗?我也担心我的电脑在完成之前可能会耗尽内存。任何建议都会很棒。 (我也尝试在文本文件上运行'unique'命令,但没有成功,演员名称每行打印1(在一列中)我在想也许命令是错误的。在Windows或Linux命令提示符下的文本文件列?)感谢您和长期发布的抱歉。我明天有一个中期,开始变得有压力。

+2

使用Set而不是List。 Set的包含效率更高,并会删除重复项。现在你需要很多GB才能真的很大。我会称一个非常大的结核病,虽然这种情况正在变得更加普遍。如果你担心500万是太多了,我建议你计算一百万用户使用多少内存,估计你需要多少内存。 – 2013-04-08 07:44:58

+0

你只能做的元素“独一无二”之后,你对它们进行排序,如果你的文件大小小于你应该在几分钟内完成一个GB(或秒,这取决于你交的作业与数据做量) – 2013-04-08 07:49:17

+0

我仍然有一个重复的问题,没有任何意义。所以程序设置要做的是读取procuder名称,然后使用producer.add(producername)将名称添加到HashSet中。在程序即将结束之前,我使用迭代器逐个将文本文件打印到文本文件中。然后我去尝试将它加载到数据库中,它仍然说它包含重复的条目。这应该是不可能的。重复的文件大小是50k,使用HashSet并打印到文本文件后出现了7k。这似乎是工作。 – Dan 2013-04-08 18:41:25

成本包括()为您提供了大致O(n)性能。 做这一百万次是我的想法,杀死你的程序。

使用的一系列HashSet的实现。它会给你理论上恒定的时间查询,并会自动为你删除重复项。

+0

谢谢,我接受了每个人的建议。这一切都基本相同。似乎现在运行速度更快。在3分钟内文件大小增加到大约12k。用数组列表花了大约45分钟。它仍然需要一个小时,但没关系。该文本文件大约1 GB。它包含800k +电影。每部电影都有关键词,演员,导演,年份,时间,评分等等。我把这个大文件变成了大约8个小文件。除了包含重复内容的导演,演员和制片人之外,我不久前完成了他们。设置很好,谢谢! – Dan 2013-04-08 08:38:40

使用SET而不是列表,这样你就不必检查集合包含的元素。设置不允许重复。

使用内存在Java中映射文件,用于向大文件 - 和ArrayList中的替代

快速访问 - 尝试使用HashMap的集合,其中的关键是演员的名字(或散列码)这会提高很多的速度,因为在一个HashMap中的关键字的查找是非常快的使用ArrayList中查找