为了比较beansdb,写了一个基于socket的java文件读取测试。
server:
import java.io.File; import java.io.IOException; import java.io.OutputStream; import java.io.PushbackInputStream; import java.net.ServerSocket; import java.net.Socket; import java.util.concurrent.Callable; import java.util.concurrent.ExecutorService; import java.util.concurrent.ScheduledThreadPoolExecutor; import org.apache.commons.io.FileUtils; import com.taobao.tlog.util.NamedThreadFactory; public class FileServer { public void run() throws IOException { bosses.submit(new Boss()); } static ExecutorService bosses = new ScheduledThreadPoolExecutor(1, new NamedThreadFactory("boss", false)); static ExecutorService workers = new ScheduledThreadPoolExecutor(1, new NamedThreadFactory("worker", false)); private static class Boss implements Callable { @Override public Object call() throws Exception { ServerSocket server = new ServerSocket(8080); while (true) { Socket socket = server.accept(); workers.submit(new Wroker(socket)); } } } private static class Wroker implements Callable { Socket socket; PushbackInputStream input; public Wroker(Socket socket) throws IOException { this.socket = socket; input = new PushbackInputStream(socket.getInputStream(), 1); } protected void receive(String path) throws IOException { File file = new File(path); byte[] data = FileUtils.readFileToByteArray(file); OutputStream output = socket.getOutputStream(); output.write(data); output.flush(); System.out.println(path+" flush"); } public void accept() throws Exception { int bytesToRead = 0; while (true) { bytesToRead = input.available(); if (bytesToRead > 0) { byte[] t = new byte[45]; input.read(t); String path = new String(t); // System.out.println("path=" + path); receive(path); } else { int b = input.read(); // 此操作会阻塞,直到有数据被读到 if (b < 0) { throw new IOException( " end of the socket input stream has been reached,may be server socket is closed!"); } else { input.unread(b); continue; } } } } @Override public Object call() { while (true) { try { accept(); } catch (Exception e) { e.printStackTrace(); System.exit(-1); } } } } public static void main(String[] args) throws IOException { new FileServer().run(); } }
client
import java.io.IOException; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.PushbackInputStream; import java.net.InetSocketAddress; import java.net.Socket; import java.text.DecimalFormat; import java.util.Random; public class FileClient { static Random random = new Random(); Socket socket; PushbackInputStream input; public FileClient() throws IOException { init(); } public void init() throws IOException { socket = new Socket(); socket.setReuseAddress(true); socket.setKeepAlive(true); socket.setTcpNoDelay(true); socket.setSoLinger(true, 0); socket.setSoTimeout(60000); socket.connect(new InetSocketAddress("localhost", 8080), 60000); input = new PushbackInputStream(socket.getInputStream(), 1); } public void send(String path) throws IOException { // System.out.println(path); OutputStream out = socket.getOutputStream(); OutputStreamWriter writer = new OutputStreamWriter(out); writer.write(path); writer.flush(); } /** * System.out.println("readed:" + readBytes + ",bytesToRead:" + bytesToRead); * <pre> * readed:-1,bytesToRead:0 * readed:-1,bytesToRead:180224 * readed:131072,bytesToRead:376831 * readed:262144,bytesToRead:344063 * readed:393216,bytesToRead:324300 * readed:524288,bytesToRead:193228 * readed:655360,bytesToRead:62156 * readed:717516,bytesToRead:0 * </pre> * @throws IOException */ public void readLine() throws IOException { int bytesToRead = 0; int readBytes = -1; while (true) { bytesToRead = input.available(); if (readBytes >= 717516) { break; } if (bytesToRead > 0) { byte[] data = new byte[bytesToRead]; readBytes += input.read(data); } else { int b = input.read(); // 此操作会阻塞,直到有数据被读到 if (b < 0) { throw new IOException( " end of the socket input stream has been reached,may be server socket is closed!"); } else { input.unread(b); continue; } } } } public void test() throws IOException { DecimalFormat df = new DecimalFormat("#00"); long begin = System.currentTimeMillis(); for (int i = 0; i < 100; i++) { int id = random.nextInt(10000); int month = id % 12 + 1; int day = id % 30 + 1; int ix = id % 99 + 1; String file = "/duitang/data/pic_test/2013/" + df.format(month) + "/" + df.format(day) + "/HDFS" + df.format(ix) + ".jpeg"; send(file); readLine(); } long end = System.currentTimeMillis(); System.out.println((end - begin) + "ms "); } public static void main(String[] args) throws IOException { FileClient client = new FileClient(); for (int i = 0; i < 10; ++i) { client.test(); } } }
测试数据准备,测试数据按照/year/month/day/data 存放,一共36000张图片:
import java.io.File; import java.io.IOException; import java.text.DecimalFormat; import org.apache.commons.io.FileUtils; public class FileUtil { public static void buildData() throws IOException { DecimalFormat format = new DecimalFormat("#00"); String path = "/duitang/data/pic_test/2013"; for (int month = 1; month < 13; ++month) { File mongthPath = new File(path, format.format(month)); mongthPath.mkdirs(); for (int day = 1; day < 31; ++day) { File dayPath = new File(mongthPath, format.format(day)); dayPath.mkdirs(); for (int i = 1; i < 100; ++i) { FileUtils.copyFile(new File("/tmp/HDFS.jpeg"), new File(dayPath, "HDFS" + format.format(i) + ".jpeg")); } } } } }
在我笔记本上的性能:
187ms 174ms 157ms 169ms 171ms 154ms 168ms 155ms 163ms 164ms
产生的图片请求,确保是随机的:
/duitang/data/pic_test/2013/03/27/HDFS48.jpeg flush /duitang/data/pic_test/2013/09/09/HDFS39.jpeg flush /duitang/data/pic_test/2013/02/08/HDFS74.jpeg flush /duitang/data/pic_test/2013/06/12/HDFS87.jpeg flush /duitang/data/pic_test/2013/08/08/HDFS50.jpeg flush /duitang/data/pic_test/2013/01/07/HDFS79.jpeg flush /duitang/data/pic_test/2013/10/16/HDFS52.jpeg flush /duitang/data/pic_test/2013/02/08/HDFS47.jpeg flush /duitang/data/pic_test/2013/07/19/HDFS88.jpeg flush /duitang/data/pic_test/2013/05/29/HDFS14.jpeg flush /duitang/data/pic_test/2013/08/20/HDFS71.jpeg flush /duitang/data/pic_test/2013/08/20/HDFS26.jpeg flush /duitang/data/pic_test/2013/03/09/HDFS45.jpeg flush /duitang/data/pic_test/2013/03/15/HDFS36.jpeg flush /duitang/data/pic_test/2013/09/21/HDFS39.jpeg flush /duitang/data/pic_test/2013/11/23/HDFS53.jpeg flush /duitang/data/pic_test/2013/04/10/HDFS64.jpeg flush /duitang/data/pic_test/2013/02/26/HDFS80.jpeg flush /duitang/data/pic_test/2013/09/27/HDFS06.jpeg flush /duitang/data/pic_test/2013/01/07/HDFS46.jpeg flush /duitang/data/pic_test/2013/04/16/HDFS19.jpeg flush /duitang/data/pic_test/2013/10/10/HDFS88.jpeg flush /duitang/data/pic_test/2013/05/11/HDFS29.jpeg flush /duitang/data/pic_test/2013/08/14/HDFS86.jpeg flush /duitang/data/pic_test/2013/07/07/HDFS85.jpeg flush /duitang/data/pic_test/2013/09/21/HDFS51.jpeg flush
disable linux cache后: 普通FS 326 ms 286 ms 303 ms 292 ms 296 ms 283 ms 292 ms 290 ms 273 ms 289 ms beansdb 368.748903275 ms 326.793909073 ms 337.444067001 ms 322.673082352 ms 336.313009262 ms 331.909179688 ms 329.982995987 ms 275.442838669 ms 271.515130997 ms 333.788871765 ms 基于BufferedRandomAccess 127ms 125ms 125ms 123ms 127ms 126ms 125ms 128ms 127ms 126ms
相关推荐
本系统是利用类java.awt.robot中的屏幕截取和鼠标、键盘自动控制功能,然后加上网络传输功能来完成来完成截屏和远程控制的。 2.2.2 系统运行概述 1.启动被监控端,打开指定的UDP端口号。用于读取命令。 2.被监控端...
Java访问权限控制,为Java操作文件、写入文件分配合适的权限,定义写到文件的信息、定义文件,输出到c:/hello.txt、写信息到文件、关闭输出流。 Java绘制图片火焰效果 1个目标文件 摘要:Java源码,图形操作,火焰...
Java访问权限控制,为Java操作文件、写入文件分配合适的权限,定义写到文件的信息、定义文件,输出到c:/hello.txt、写信息到文件、关闭输出流。 Java绘制图片火焰效果 1个目标文件 摘要:Java源码,图形操作,火焰...
Java访问权限控制,为Java操作文件、写入文件分配合适的权限,定义写到文件的信息、定义文件,输出到c:/hello.txt、写信息到文件、关闭输出流。 Java绘制图片火焰效果 1个目标文件 摘要:Java源码,图形操作,火焰...
Java访问权限控制,为Java操作文件、写入文件分配合适的权限,定义写到文件的信息、定义文件,输出到c:/hello.txt、写信息到文件、关闭输出流。 Java绘制图片火焰效果 1个目标文件 摘要:Java源码,图形操作,火焰...
Java访问权限控制,为Java操作文件、写入文件分配合适的权限,定义写到文件的信息、定义文件,输出到c:/hello.txt、写信息到文件、关闭输出流。 Java绘制图片火焰效果 1个目标文件 摘要:Java源码,图形操作,火焰...
文件流操作:使用Java的文件输入输出流(FileInputStream、FileOutputStream)读取和写入文件内容。 多线程处理:通过多线程实现并发处理多个文件传输请求,提高传输效率。 异常处理:处理网络异常、文件读写异常等...
Java访问权限控制,为Java操作文件、写入文件分配合适的权限,定义写到文件的信息、定义文件,输出到c:/hello.txt、写信息到文件、关闭输出流。 Java绘制图片火焰效果 1个目标文件 摘要:Java源码,图形操作,火焰...
Java数组倒置 简单 Java图片加水印,支持旋转和透明度设置 摘要:Java源码,文件操作,图片水印 util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、水印...
5.主控端和被监控端读取和发送数据,分别来实现文件上传和下载。 6.在被监控端实现DOS命令的执行。 系统使用的关键技术就是Java网络编程和Java图形编程。用Java网络编程实现主控端和被监控端的通讯(命令收发、...
Java数组倒置 简单 Java图片加水印,支持旋转和透明度设置 摘要:Java源码,文件操作,图片水印 util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、水印...
Java读写文本文件的示例代码 1个目标文件。 java俄罗斯方块 一个目标文件。 Java非对称加密源码实例 1个目标文件 摘要:Java源码,算法相关,非对称加密 Java非对称加密源程序代码实例,本例中使用RSA加密技术,...
本设计主要实现基于JAVA的本地端口监听与远程主机端口扫描功能。本地端口监听用于监控本机某一端口是否有连接请求,远程端口扫描用于检测远程主机开放的端口情况。 本地端口监听实现通过JAVA的ServerSocket类,创建...
应用程序通过创建套接字、绑定套接字到本地地址、监听网络连接、接受连接请求、读写数据等操作,实现与远程计算机的通信。 Socket编程通常使用特定的编程语言提供的库函数来实现。例如,在C语言中,可以使用BSD套接...
URL和URLConnection:Java提供了java.net.URL和java.net.URLConnection等类,用于访问URL指定的资源,如网页、文件等,并进行数据的读取和写入。 HTTP客户端:Java提供了java.net.HttpURLConnection等类,用于创建...
本书内容全面,涵盖了从网络基础知识到远程方法调用(RMI)等各方面的内容,书中章节涉及到TCP和UDP socket、服务器socket、URL和URI、组播以及特殊用途的API(如JavaMail)等等。本书展示了如何使用JSSE编写安全的...
序列化是一种将对象以一连串的字节描述的过程,用于解决在对对象流进行读写操作时所引发的问题。序列化可以将对象的状态写在流里进行网络传输,或者保存到文件、数据库等系统中,并在需要时把该流读取出来重新构造...