我有一个包含两百万行的大文件。我希望遍历文件的每一行,将其处理为一个键值对,并将其存储到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 Pattern)是 Java 和 .Net 编程环境中非常常用的设计模式。这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示。 迭代器模式属于行为型模式。 介绍 意图:提供一种方法顺序访问一个聚合对象中各个元素, 而又无须暴露该对象的内部表示。 主要解决:不同的方式来遍历整个整合对象。 何时使用:遍历一个聚合对象。 如何解决:把在元素之间游走的责任交给迭
迭代器模式(Iterator Pattern)是 Java 和 .Net 编程环境中非常常用的设计模式。这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示。 迭代器模式属于行为型模式。 介绍 意图:提供一种方法顺序访问一个聚合对象中各个元素, 而又无须暴露该对象的内部表示。 主要解决:不同的方式来遍历整个整合对象。 何时使用:遍历一个聚合对象。 如何解决:把在元素之间游走的责任交给迭
迭代器模式中,迭代器(允许我们遍历集合中所有元素的对象)顺序迭代一个集合对象中的元素而无需暴漏其底层形式。 迭代器封装了这种特别的迭代操作的内部结构,就jQuery的jQuery.fn.each()迭代器来说,我们实际上可以使用jQuery.each()底层的代码来迭代一个集合,而无需知道或者理解后台提供这种功能的代码是如何实现的。 这种模式可以被理解为门面模式的一种特例,在这里我们只处理与迭代有
迭代器模式 使用过C++的朋友大概对迭代器模式都不会太陌生。这主要是因为我们在编写代码的时候离不开迭代器,队列有迭代器,向量也有迭代器。那么,为什么要迭代器呢?这主要是为了提炼一种通用的数据访问方法。 比如说,现在有一个数据的容器, typedef struct _Container { int* pData; int size; int length;