锁定老帖子 主题:成都支付宝面试归来
该帖已经被评为良好帖
|
|
---|---|
作者 | 正文 |
发表时间:2007-03-21
wuhua 写道 former 写道 那位总监提出的假设是很实际的,我曾经写过一个日志分析类,当然内容比这个面试的复杂一些,除了找到一些关键的词还要对进出日志做对应,按时间排序等等。文件大小不到1G,由于没有使用缓存,导致OutOfMemorey...
后来自己做个缓存,每读200行flush一次,才搞定。 我对你写的这个比较感兴趣,能否共享下源代码呢。 呵呵 这个source我也没有,因为开发在公司内网,所有的代码都拿不出来,偶不是骇客,没那个技术。 不好意思。个人也不是很赞同公司的做法。 |
|
返回顶楼 | |
发表时间:2007-03-21
我觉得这个问题不复杂啊,可以用LineNumberReader处理,它是扩展了BufferedReader,可以设置缓冲区大小。如果像楼上的朋友,需要要有涉及多个处理过程,那就使用管道就应该可以搞定了
|
|
返回顶楼 | |
发表时间:2007-03-28
|
|
返回顶楼 | |
发表时间:2007-03-28
只用vc写过一个类似的日志分析器
分别在子线程里读并解析日志 每次读一定数量的行到内存里 不然高频率io太耗资源了 解析完就马上释放了内存 当然不忘定量Sleep下 分析个几百M的日志文件似乎还马马虎虎 |
|
返回顶楼 | |
发表时间:2007-03-30
卒子99 写道 我觉得这个问题不复杂啊,可以用LineNumberReader处理,它是扩展了BufferedReader,可以设置缓冲区大小。如果像楼上的朋友,需要要有涉及多个处理过程,那就使用管道就应该可以搞定了
我用BufferedReader去一行行读一个450M的文件,然后每行去检验在不在一个size 为100左右的 ArrayList里面,整个文件匹配完需要6分钟。。。 |
|
返回顶楼 | |
发表时间:2007-04-01
昨天用我也弄了一个代码测试了一下。文件大小有589,839K,不过不知道楼上的朋友怎么存储匹配的结果。放内存中肯定要OutOfMemomry,我写到文件中,产生的日志有600多M。所以我在测试的时候就没有存储结果了。下面是代码
import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStreamReader; import java.io.LineNumberReader; import java.util.LinkedList; import java.util.List; public class SearchKeyDemo { final public String fileName; final public String key; //缓冲区大小 int size = 8 * 1024; List<String> list = new LinkedList<String>(); public SearchKeyDemo(String fileName, String key) { this.fileName = fileName; this.key = key; if(this.fileName==null||this.key==null) throw new NullPointException(); } public void pocessSearch() { File file = new File(fileName); if (file.isFile() == false || key == null || key.length() <= 0) { return; } FileInputStream input = null; LineNumberReader reader = null; try { input = new FileInputStream(file); // 读数据 reader = new LineNumberReader(new InputStreamReader(input), size); String s = null; while ((s = reader.readLine()) != null) { proccessLine(reader.getLineNumber(), s, key); } } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { if (reader != null) { try { reader.close(); } catch (IOException e) { } } if (input != null) { try { input.close(); } catch (IOException e) { } } } } public List<String> getList() { return list; } public void proccessLine(final int line, String value, String key) { int index = 0; do { // 获取子串 String subString = value.substring(index); if (subString == null || subString.trim().length() <= 0) { break; } int position = getKeyIndex(subString, key); if (position < 0) { break; } index += position; // 保存得到的记录 // list.add(line + "行," + index + "列"); // 要检查的子串长度小于关键字的字符串的长度,则退出 if (index + 2 * key.length() > value.length()) { break; } index += key.length(); } while ((index + key.length()) < value.length()); } /** * 得到当前字符串的第一个关键字所在的位置 * * @param value * @param key * @return */ public int getKeyIndex(String value, String key) { return value.indexOf(key); } /** * @param args */ public static void main(String[] args) { SearchKeyDemo demo = new SearchKeyDemo("C:/test.txt", "alibaba"); long start = System.currentTimeMillis(); demo.pocessSearch(); long end = System.currentTimeMillis(); System.out.println("用时:" + (end - start) + "ms"); } } 得到了一组结果: 缓存区大小 耗时(ms) 默认 57187 10*1024 55809 12*1024 55063 8*1027 54672 如果选择大打印出来,也挺耗时的 |
|
返回顶楼 | |
发表时间:2007-05-29
卒子99 写道 昨天用我也弄了一个代码测试了一下。文件大小有589,839K,不过不知道楼上的朋友怎么存储匹配的结果。放内存中肯定要OutOfMemomry,我写到文件中,产生的日志有600多M。所以我在测试的时候就没有存储结果了。下面是代码
... 时间都在IO上 |
|
返回顶楼 | |
发表时间:2007-05-30
性能问题,楼主的回答也不能算错的。 性能无非是时间换空间,空间换时间。 没有说运行环境,和性能目标,仅仅"1G大小的文件"这个条件不足以做判断。
|
|
返回顶楼 | |
发表时间:2007-05-30
是不是用NIO操作,效率比较高。
|
|
返回顶楼 | |
发表时间:2007-05-30
一般情况一行一行读 是不会内存溢出的
除非一行的数据就有几百M |
|
返回顶楼 | |