w********p 发帖数: 948 | 1 1. generates 100 文件,每个文件有10,000行,每行10个数字,每个数字8位
2. 读10 文件,uses fork/join paradigm to map/reduce。 先sort 每个文件,然后
merge多个文件,outputs results 到一个output 文件,每行10个数字,每个数字8位
假设程序是在production环境里。
---
问题1. java8, java nio里提供了
Files.lines(Paths.get(OUTPUT_DIR + fileName)).
collect(Collectors.toList());
我的理解是这个在java8里应该已经是multithread的了。
但是如果我想同时multithread读10 files. 该怎么写?
问题2. java8 里要怎样同时写(writer) 十个files
//像是java6里开10个Threads, 这个我是会的。
还有java8里到底用什么操作Files,也有很多的讨论。
是用Using java.nio.file.Files
还是FileChannel
还是FileChannel and memory mapped file
还是FileChannel and Direct Memory Access
还是RandomAccessFile
求java8大牛们不吝赐教 |
t**r 发帖数: 3428 | |
w********p 发帖数: 948 | 3 这个是作业。
翻了很多links。还是很没头绪的说。
【在 t**r 的大作中提到】 : 面试问这个?对库不熟悉的直接会挂了。。
|
A*******e 发帖数: 2419 | 4 那你说是面试题,来骗答案?
找TA去啊。
【在 w********p 的大作中提到】 : 这个是作业。 : 翻了很多links。还是很没头绪的说。
|
c*****e 发帖数: 3226 | 5 很容易的。
class SortSolution extends RecursiveTask {
final File[] files;
final int size;
Solution (File[] files) {
this.files = files;
this.size = files.length;
}
File[] sort() {
if (size== 1)
return files[0].sort();
File[] f1 = new SortSolution (files[0:size/2];
f1.fork();
File[] f2 = new SortSolution (files[size/2:size];
return f2.compute() + f1.join();
}
}
其实这玩意用Guava ListenableFutureTask 也很爽, 因为可以串联。只是这里用不上
ListeningExecutorService service = MoreExecutors.listeningDecorator(
Executors.newFixedThreadPool(10));
List> futures = ..
for (File f: files) {
ListenableFuture ft = service.submit(new Callable() {
public File call() {
return sortFile(f);
}
});
futures.add(ft)
}
ListenableFuture> ft2 = Futures.allAsList(futures);
【在 w********p 的大作中提到】 : 这个是作业。 : 翻了很多links。还是很没头绪的说。
|
w********p 发帖数: 948 | 6 面试的作业. 满多公司都会有让你在家写的面试作业啊。
比如,Yelp, Sansum, Uber, ....
【在 A*******e 的大作中提到】 : 那你说是面试题,来骗答案? : 找TA去啊。
|
w********p 发帖数: 948 | 7 非常谢谢。我仔细研究下。
【在 c*****e 的大作中提到】 : 很容易的。 : class SortSolution extends RecursiveTask { : final File[] files; : final int size; : Solution (File[] files) { : this.files = files; : this.size = files.length; : } : File[] sort() { : if (size== 1)
|
w********p 发帖数: 948 | 8 我有去翻了写资料。
不过fork-join 和Parallel stream 哪个更快,是有争议的。
您有这方面的经验吗?
实在不行,我就fork-join 和Parallel stream 都写了。然后跑下benchmark.
【在 c*****e 的大作中提到】 : 很容易的。 : class SortSolution extends RecursiveTask { : final File[] files; : final int size; : Solution (File[] files) { : this.files = files; : this.size = files.length; : } : File[] sort() { : if (size== 1)
|
w********p 发帖数: 948 | 9 程序终于吭哧吭哧写完了。
公司说要和我面聊suggestion. 头疼。不知道要建议个啥。
恳请大牛们批评指教。与其被别人challenge, 不如在这预先知道的说。一定发包子感
谢的说。
https://github.com/selinaGit/SortNFiles
为了搏眼球,牺牲下隐私。貌似无盐,切勿下载哦,否则是小猪🐷
还有主要的reference 是下面这个link. 照葫芦画瓢的说。
http://www.oracle.com/technetwork/articles/java/fork-join-42260
我想请教下在上面的link里为什么要用static method return new object.
而不是 用非static method "public Document fromFile(File file)" 然后 new
WordCounter obj
调用obj.Document fromFile(File file)
没有concurrency 的经验。问题有点傻。求教的说。
我的理解是这样的话,fork之前,file就read到list里了,file reading不会
是多线程一起run。
class Document {
private final List lines;
Document(List lines) {
this.lines = lines;
}
List getLines() {
return this.lines;
}
static Document fromFile(File file) throws IOException {
List lines = new LinkedList<>();
try(BufferedReader reader = new BufferedReader(new FileReader(file))
) {
String line = reader.readLine();
while (line != null) {
lines.add(line);
line = reader.readLine();
}
}
return new Document(lines);
}
} |