一亩三分地论坛

 找回密码
 获取更多干货,去instant注册!

一亩三分地官方iOS手机应用下载
查看: 1116|回复: 8
收起左侧

面试assignment:从txt文件里读取2百万行double数字。

[复制链接] |试试Instant~ |关注本帖
GUIXIANG 发表于 2016-3-12 16:03:33 | 显示全部楼层 |阅读模式

2016(1-3月) 码农类 本科 全职@LA小公司 - 网上海投 - 其他 |Other在职跳槽

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看,没有帐号?获取更多干货,去instant注册!

x
求助一道面试题的解法。一家小公司,经历了OA, HR面,技术电面,最后还有个assignment,做完发过去对方表示要求改进,也是醉了。。。
. 1point 3acres 璁哄潧
.鏈枃鍘熷垱鑷1point3acres璁哄潧
题目要求大概是从一个TXT文件里读取2 million个double数字,然后用scatter plot显示出来,用Java。现在难点就在怎么高效读取这2 million个数字。
TXT文件中每个数字一行(最左边是index,可以理解成X coordinate, 右边的巨长的数字就是对应的y coordinate了), 从左往右大概长这样:
1        -54.72667778993478
2        -0.1853811220527842
3        -21.05360038908366
4        27.73363348487282
5        -23.62219135594701
6        -56.01573967610933
7        34.08019445333898
8        20.06996064538601
9        60.77511214805872
10        16.44672527397671. 1point 3acres 璁哄潧


刚开始俺很土鳖的用了BufferedReader一行一行的读取,然后还得替换其中的空格,找到y coordinate,大概这样:
.鐣欏璁哄潧-涓浜-涓夊垎鍦
private static List<List<Double>> readFile() {
        List<List<Double>> data = new ArrayList<List<Double>>();
        List<Double> dataX = new ArrayList<Double>();
        List<Double> dataY = new ArrayList<Double>();
        String delimiter = SPACE;
        try {.鏈枃鍘熷垱鑷1point3acres璁哄潧
. 鍥磋鎴戜滑@1point 3 acres
            long start = System.currentTimeMillis();
. more info on 1point3acres.com
            File file = new File("Path to data2M.txt");
            BufferedReader br = new BufferedReader(new FileReader(file));
            String line;
            while ((line = br.readLine()) != null) {
                line = line.replaceAll("\\s+", delimiter);
                dataX.add(Double.parseDouble(line.split(delimiter)[0]));
                dataY.add(Double.parseDouble(line.split(delimiter)[1]));
            }
            data.add(dataX);
            data.add(dataY);. 鐣欏鐢宠璁哄潧-涓浜╀笁鍒嗗湴
            long end = System.currentTimeMillis();
            System.out.println();
            System.out.println("time2: " + (end - start) + " size is" + dataY.size());. 1point 3acres 璁哄潧
        } catch (Exception ex) {
            // Ideally there should be a logger here, logging information including
            // exception level (ERROR, WARN, INFO, etc), class name and messages
            // that makes the debugging easier.
            ex.printStackTrace();
        }
        return data;
    }


发过去之后收到反馈,有performance issue,需要改进。加了两个System.currentTimeMillis()一看需要6秒多,蛋疼。。。
.鐣欏璁哄潧-涓浜-涓夊垎鍦

然后一顿Google+投机取巧,搞出来一个稍微快点儿的利用FileChannel和ByteBuffer的版本,如下,但是还是要3秒多,无奈了。。。
. 鍥磋鎴戜滑@1point 3 acres

private static List<List<Double>> readFileFast() {. 鐗涗汉浜戦泦,涓浜╀笁鍒嗗湴
        FileInputStream fIn;
        FileChannel fChan;
        long fSize;
        ByteBuffer mBuf;-google 1point3acres
        List<List<Double>> data = new ArrayList<List<Double>>();
        List<Double> dataX = new ArrayList<Double>();//可要可不要, 就是从1到2M,完全可以fake一个,不用真正读取。。。
        List<Double> dataY = new ArrayList<Double>();. 1point 3acres 璁哄潧
        try {

            long start = System.currentTimeMillis();
. From 1point 3acres bbs
            fIn = new FileInputStream("Path to data2M.txt");. From 1point 3acres bbs
            fChan = fIn.getChannel();
            fSize = fChan.size();
            mBuf = ByteBuffer.allocate((int) fSize);
            fChan.read(mBuf);. From 1point 3acres bbs
            mBuf.rewind();
            StringBuffer sb = new StringBuffer();
            for (int i = 0; i < fSize; i++) {. 1point3acres.com/bbs
                sb.append((char)mBuf.get());
                if (sb.charAt(sb.length()-1) == '\n') {. 鐗涗汉浜戦泦,涓浜╀笁鍒嗗湴
                    dataY.add(Double.parseDouble(sb.toString().substring(8)));//用8是因为数据格式很固定,y coordinate都是从index 8 开始,AKA投机取巧。。。
                    sb = new StringBuffer();
                }. 鐣欏鐢宠璁哄潧-涓浜╀笁鍒嗗湴
            }. 鍥磋鎴戜滑@1point 3 acres
            fChan.close(); 鏉ユ簮涓浜.涓夊垎鍦拌鍧.
            fIn.close();
            data.add(dataX);//可要可不要
            data.add(dataY);

            long end = System.currentTimeMillis();. 鐗涗汉浜戦泦,涓浜╀笁鍒嗗湴
            System.out.println();
            System.out.println("time1: " + (end - start) + " size is" + dataY.size());
        } catch (IOException exc) {
            System.out.println(exc);
            System.exit(1);
        }. from: 1point3acres.com/bbs
        return data;
    }


我感觉这行代码比较浪费时间:
if (sb.charAt(sb.length()-1) == '\n')
但是实在不知道怎么更好的实现。求各位大神指导啊~~~
.1point3acres缃

另外,对方还表示画出来的点(其实是Rectangle2D.Double),zoom in(要求实现的功能之一)之后会pixelate,这个怎么搞?

评分

1

查看全部评分

 楼主| GUIXIANG 发表于 2016-3-13 02:36:15 | 显示全部楼层
关注一亩三分地公众号:
Warald_一亩三分地
csddff 发表于 2016-3-12 16:31
这可能就是Jeff Atwood所倡议的“试镜”了,直接给你分一个他们实际工作中遇到的小问题,要你搞定,来看你 ...
. 1point3acres.com/bbs
太费时间,如果做完不给offer,按照现在工资标准给点儿补助还能接受lol
回复 支持 1 反对 0

使用道具 举报

 楼主| GUIXIANG 发表于 2016-3-12 16:17:57 | 显示全部楼层
关注一亩三分地微博:
Warald
最后一句话没说明白。。。zoom in已经用BufferedImage.getScaledInstance实现了,但是对方表示zoom in 之后会pixelate,这个该怎么避免呢?
回复 支持 反对

使用道具 举报

wcyz666 发表于 2016-3-12 16:26:42 | 显示全部楼层
如果每一行的长度都是一样的,就用RandomAccessFile开多线程或者上ExecutorService去读?没实践过。。。
回复 支持 反对

使用道具 举报

csddff 发表于 2016-3-12 16:31:44 | 显示全部楼层
这可能就是Jeff Atwood所倡议的“试镜”了,直接给你分一个他们实际工作中遇到的小问题,要你搞定,来看你真实的工作能力
求职神器indeed - 在全球最大的求职网站找找适合你的工作?
回复 支持 反对

使用道具 举报

 楼主| GUIXIANG 发表于 2016-3-13 02:34:58 | 显示全部楼层
wcyz666 发表于 2016-3-12 16:26
如果每一行的长度都是一样的,就用RandomAccessFile开多线程或者上ExecutorService去读?没实践过。。。

每一行的长度不一样。。。
我是十分不想上多线程。。。感觉搞这么个assignment太费时间,还不一定有offer。。。
回复 支持 反对

使用道具 举报

wcyz666 发表于 2016-3-13 05:41:51 | 显示全部楼层
GUIXIANG 发表于 2016-3-13 02:36
太费时间,如果做完不给offer,按照现在工资标准给点儿补助还能接受lol

那就有一个工作队列吧,有一个线程只负责读,一千行就打包成一个task进队列让worker线程去处理task
回复 支持 反对

使用道具 举报

 楼主| GUIXIANG 发表于 2016-3-14 09:32:30 | 显示全部楼层
关于读取单个大文件,第二个版本比第一个版本快了58%(用个for loop跑了100次算平均时间)。
貌似多线程并不会让速度更快(http://stackoverflow.com/a/18972018)。
画这个scatter plot的代码也比较费时间,就开了四个线程来分别画,速度确实快了点儿,基本降到了原来画图所用时间的四分之一:D。.鏈枃鍘熷垱鑷1point3acres璁哄潧
.鐣欏璁哄潧-涓浜-涓夊垎鍦
像素化的问题依然不知道怎么解决,我准备告诉他们去套用别人的library吧,比如JFreeChart啥的,俺是没时间搞了。
回复 支持 反对

使用道具 举报

 楼主| GUIXIANG 发表于 2016-3-18 12:19:03 | 显示全部楼层
发邮件表示这都前前后后一个月了,求本周给答复,然后被拒。
move on~~
回复 支持 反对

使用道具 举报

本版积分规则

请点这里访问我们的新网站:一亩三分地Instant.

Instant搜索更强大,不扣积分,内容组织的更好更整洁!目前仍在beta版本,努力完善中!反馈请点这里

关闭

一亩三分地推荐上一条 /5 下一条

手机版|小黑屋|一亩三分地论坛声明 ( 沪ICP备11015994号 )

custom counter

GMT+8, 2017-3-28 08:46

Powered by Discuz! X3

© 2001-2013 Comsenz Inc. Design By HUXTeam

快速回复 返回顶部 返回列表