【发布时间】:2013-04-08 07:43:18
【问题描述】:
我有一个简短的问题。我正在做一个学校项目,我需要解析一个非常大的文本文件。这是一个数据库类,所以我需要从文件中获取唯一的演员名称,因为演员将是 mysql 数据库中的主键。我已经编写了解析器并且效果很好,但当时我忘记删除重复项。所以,我决定最简单的方法是创建一个演员数组列表。 (使用 ArrayList ADT)然后使用 contains() 方法检查演员名称是否在 arraylist 中,然后再将其打印到新的文本文件中。如果是我什么都不做,如果不是我将它添加到数组列表并打印到页面。现在程序运行非常缓慢。在arraylist之前,大约花了5分钟。旧的演员文件是 180k,没有删除重复项。现在它已经运行了 30 分钟,到目前为止是 12k。 (这次我预计总共有 100k-150k。)
我将arraylist的大小留空,因为我不知道文件中有多少个actor,但至少有1-2百万。我当时正在考虑只投入 500 万美元,然后检查它是否得到了全部。 (只需检查最后一个 arraylist 索引,如果为空,它没有用完空间。)这会减少时间,因为 arraylist 不会不断加倍并重新复制所有内容吗?还有比这更快的方法吗?我还担心我的计算机在完成之前可能会耗尽内存。任何建议都会很棒。
(我也尝试在文本文件上运行 'unique' 命令但没有成功。演员名称每行打印 1 个。(在一列中)我在想命令可能是错误的。你将如何从windows 或 linux 命令提示符中的文本文件列?)谢谢你,很抱歉发了这么长的帖子。我明天有期中考试,开始感到压力。
【问题讨论】:
-
使用集合而不是列表。 Set 的 contains 效率更高,并且会删除重复项。如今,您需要很多 GB 才能变得非常大。我会称 TB 非常大,尽管这也变得越来越普遍。如果你担心500万太多,我建议你计算一百万使用多少内存,估计你需要多少内存。
-
您只能在对元素进行排序后对元素执行“唯一”操作,如果您的文件大小小于 GB,您应该在几分钟内完成(或几秒钟,具体取决于您的工作量)处理这些数据)
-
我仍然有一个重复的问题,这没有意义。所以程序设置要做的是读取生产者名称,然后我使用 producer.add(producername) 将名称添加到 HashSet。在程序终止之前的最后,我使用迭代器将集合一次打印到文本文件中。然后我去尝试将它加载到数据库中,它仍然说它包含重复的条目。这应该是不可能的。具有重复项的文件大小为 50k,使用 HashSet 并打印到文本文件后,结果为 7k。看起来它正在工作。