论坛首页 招聘求职论坛

成都支付宝面试归来

浏览 32805 次
该帖已经被评为良好帖
作者 正文
   发表时间:2007-03-21  
wuhua 写道
former 写道
那位总监提出的假设是很实际的,我曾经写过一个日志分析类,当然内容比这个面试的复杂一些,除了找到一些关键的词还要对进出日志做对应,按时间排序等等。文件大小不到1G,由于没有使用缓存,导致OutOfMemorey...
后来自己做个缓存,每读200行flush一次,才搞定。

我对你写的这个比较感兴趣,能否共享下源代码呢。
呵呵

这个source我也没有,因为开发在公司内网,所有的代码都拿不出来,偶不是骇客,没那个技术。
不好意思。个人也不是很赞同公司的做法。
0 请登录后投票
   发表时间:2007-03-21  
我觉得这个问题不复杂啊,可以用LineNumberReader处理,它是扩展了BufferedReader,可以设置缓冲区大小。如果像楼上的朋友,需要要有涉及多个处理过程,那就使用管道就应该可以搞定了
0 请登录后投票
   发表时间:2007-03-28  
http://java.sun.com/developer/technicalArticles/Programming/PerfTuning/

大家到这里看一看吧,是英文版
0 请登录后投票
   发表时间:2007-03-28  
只用vc写过一个类似的日志分析器
分别在子线程里读并解析日志
每次读一定数量的行到内存里
不然高频率io太耗资源了
解析完就马上释放了内存
当然不忘定量Sleep下
分析个几百M的日志文件似乎还马马虎虎
0 请登录后投票
   发表时间:2007-03-30  
卒子99 写道
我觉得这个问题不复杂啊,可以用LineNumberReader处理,它是扩展了BufferedReader,可以设置缓冲区大小。如果像楼上的朋友,需要要有涉及多个处理过程,那就使用管道就应该可以搞定了

我用BufferedReader去一行行读一个450M的文件,然后每行去检验在不在一个size 为100左右的 ArrayList里面,整个文件匹配完需要6分钟。。。
0 请登录后投票
   发表时间: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

如果选择大打印出来,也挺耗时的
0 请登录后投票
   发表时间:2007-05-29  
卒子99 写道
昨天用我也弄了一个代码测试了一下。文件大小有589,839K,不过不知道楼上的朋友怎么存储匹配的结果。放内存中肯定要OutOfMemomry,我写到文件中,产生的日志有600多M。所以我在测试的时候就没有存储结果了。下面是代码


...

时间都在IO上
0 请登录后投票
   发表时间:2007-05-30  
性能问题,楼主的回答也不能算错的。 性能无非是时间换空间,空间换时间。 没有说运行环境,和性能目标,仅仅"1G大小的文件"这个条件不足以做判断。
0 请登录后投票
   发表时间:2007-05-30  
是不是用NIO操作,效率比较高。
0 请登录后投票
   发表时间:2007-05-30  
一般情况一行一行读  是不会内存溢出的
除非一行的数据就有几百M
0 请登录后投票
论坛首页 招聘求职版

跳转论坛:
Global site tag (gtag.js) - Google Analytics