1

在 Linux 上本地化。20k 条消息大约需要 10 秒。我的猜测是我的 Java 很糟糕,而 Python 很好。

py客户端:

def scan(self, msg):
    try:
        print 'begin scan'
        HOST = 'localhost'
        PORT = 33000
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.connect((HOST, PORT));
        s.sendall(msg)
        data = s.recv(1024)
        s.close()
        print 'Received', repr(data)
    except Exception, e:
        print "error: " + str(e)

Java服务器:

    ServerSocket service = new ServerSocket(33000); 

    while(true) {

    debug("Begin waiting for connection");

    //this spins
    Socket connection = service.accept();

    debug("Connection received from " + connection.getInetAddress().getHostName());

    OutputStreamWriter out = new OutputStreamWriter(connection.getOutputStream());
    BufferedInputStream in = new BufferedInputStream(connection.getInputStream());


    ScanResultsHeader results = new ScanResultsHeader();

        Scanner scanner = new Scanner();
        results = scanner.scan("scannerfake@gmail.com", "123", in);

公共 ScanResultsHeader 扫描(字符串 userEmail、字符串 imapRetrievalId、BufferedInputStream mimeEmail)抛出 IOException、FileNotFoundException、MimeException、ScannerException {

    //how fast would it be to just slurp up stream?
    debug("slurp!");
    String slurp = IOUtils.toString(mimeEmail);
    debug("slurped " + slurp.length() + " characters");
    slurp = slurp.toLowerCase();
    debug("lc'ed it");
    //...

我的猜测是我把输入流弄错了。一个问题是使用的库 API 扫描需要“BufferedInputStream mimeEmail”签名,因此我最终需要使用该表单。但我注意到啜食一根绳子的简单动作需要很长时间,所以我已经在做一些不正确的事情了。

4

2 回答 2

0

修改我的答案....

如果你的阅读效率很高,而且看起来确实如此,那只会花费很多时间,因为

  • 每次发送消息时,您都在创建一个新连接,这可能非常昂贵。
  • 您发送数据的速度并没有您想象的那么快。
  • 消息非常大(不太可能,但可能)

有很多关于如何做到这一点的例子,你可以使用的一个好的库是 IOUtils,它使它更简单。

您应该能够通过 Java 中的单个套接字发送大约 200K/s 的消息。


如果你有一个使用 Big Endian 的发送 X 字节协议,你可以这样做。

DataInputStream dis = new DataInputStream( ...
int len = dis.readInt();
byte[] bytes = new byte[len];
dis.readFully(bytes);
String text = new String(bytes, "UTF-8");
于 2012-04-18T18:55:24.397 回答
0

最初的问题是客户端没有发送输入结束,因此“slurp”操作一直在等待更多的东西通过连接。

解决方案是实现一个应用层协议,提前发送消息的大小,然后在那么多字节之后停止监听更多的消息。我更喜欢一个标准库——比如,FiniteInputStream 扩展了 BufferedInputStream 并将大小作为参数,但我自己编写了。

于 2012-04-19T18:16:29.677 回答