我有一个包含两百万行的大文件。我希望遍历文件的每一行,将其处理为一个键值对,并将其存储到hashmap中,以便稍后进行比较。然而,出于空间复杂性的考虑,我不希望有一个包含200万个键值对的hashmap。相反,我希望遍历N行文件,并将它们的键值对加载到hashmap中,进行比较,然后将接下来的N行加载到hashmap中,依此类推。
用例的一个例子:
文件txt:
1 Jack London
2 Mary Boston
3 Jay Chicago
4 Mia Amsterdam
5 Leah New York
6 Bob Denver
.
.
.
假设N=3作为hashmap的大小,在第一次迭代时,hashmap将存储文件前三行的键值对,即
1 Jack London
2 Mary Boston
3 Jay Chicago
在对这些键值对进行比较后,接下来的3行将作为键值对加载到hashmap中:
4 Mia Amsterdam
5 Leah New York
6 Bob Denver
依此类推,直到文件中的所有行都被迭代过。我如何使用java中的迭代器设计模式来实现这一点?
你可以这样做:
public class Temp {
public static void main(String[] args) throws Exception {
BufferedReader reader = new BufferedReader(new InputStreamReader(get file input stream here));
int maxSize = 3;
Map<String, String> map = new HashMap<>(maxSize);
String line = reader.readLine();
while (line != null) {
String[] data = line.split("\\s+");//some dummy parsing
String key = data[1];
String value = data[2];
map.put(key, value);
if (map.size() == maxSize) {
//do whatever operations you need
System.out.println(map);
map.clear();
}
line = reader.readLine();
}
if (map.size() > 0) {
//deal with leftovers
System.out.println(map);
}
}
}
基本上读取和解析地图,直到地图达到最大大小,然后操作内容并清空它。继续这样做,直到你读完了整个文件。最后,如果有剩余内容,请对其进行操作。
我正在从Cloudera包裹中运行带有Spark 0.9.0的CDH 4.4。 我有一堆Avro文件是通过Pig的AvroStorage UDF创建的。我想在 Spark 中加载这些文件,使用通用记录或载入 Avro 文件的架构。到目前为止,我已经尝试过这个: 这适用于一个文件,但它不能扩展——我将所有数据加载到本地RAM中,然后从那里跨spark节点分发。
主要内容:介绍,实现,Iterator.java,Container.java,NameRepository.java,IteratorPatternDemo.java迭代器模式(Iterator Pattern)是 Java 和 .Net 编程环境中非常常用的设计模式。这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示。 迭代器模式属于行为型模式。 介绍 意图:提供一种方法顺序访问一个聚合对象中各个元素, 而又无须暴露该对象的内部表示。 主要解决:不同的方式来遍历整个整合对象。
亦称: Iterator 意图 迭代器模式是一种行为设计模式, 让你能在不暴露集合底层表现形式 (列表、 栈和树等) 的情况下遍历集合中所有的元素。 问题 集合是编程中最常使用的数据类型之一。 尽管如此, 集合只是一组对象的容器而已。 各种类型的集合。 大部分集合使用简单列表存储元素。 但有些集合还会使用栈、 树、 图和其他复杂的数据结构。 无论集合的构成方式如何, 它都必须提供某种访问元素的方式
迭代器模式是指提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示。 JavaScript中的Array.prototype.forEach 一、jQuery中的迭代器 $.each([1, 2, 3], function(i, n) { console.log("当前下标为:"+ i + " 当前元素为:"+ n ); }); 二、实现自己的迭代器 var eac
迭代器模式(Iterator Pattern)是 Java 和 .Net 编程环境中非常常用的设计模式。这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示。 迭代器模式属于行为型模式。 介绍 意图:提供一种方法顺序访问一个聚合对象中各个元素, 而又无须暴露该对象的内部表示。 主要解决:不同的方式来遍历整个整合对象。 何时使用:遍历一个聚合对象。 如何解决:把在元素之间游走的责任交给迭
迭代器模式(Iterator Pattern)是 Java 和 .Net 编程环境中非常常用的设计模式。这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示。 迭代器模式属于行为型模式。 介绍 意图:提供一种方法顺序访问一个聚合对象中各个元素, 而又无须暴露该对象的内部表示。 主要解决:不同的方式来遍历整个整合对象。 何时使用:遍历一个聚合对象。 如何解决:把在元素之间游走的责任交给迭