0

memcached内のすべてのキーをダンプするタスクがあり、これを行うためのスクリプトがstackoverflowにあります:python-memcacheを使用してmemcachedからすべてのキーと値をエクスポートする方法は? ニーズに合わせて少し変更しましたが、「実際の5m57.396s」でしたが、同じアルゴリズムのJavaバージョンでは「実際の0m5.190s」でした。Pythonバージョンのパフォーマンスのボトルネックはどこにあるのかを理解したいと思います。以下は、JavaおよびPythonバージョンのコードです

import java.io.*;
import java.io.OutputStreamWriter;
import java.util.Scanner;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
import java.util.HashSet;
import java.util.Iterator;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class DumpMemcache {
    public static void main(String[] args) throws IOException {
        try {
            Socket socket = new Socket(args[0], Integer.parseInt(args[1]));
            socket.setKeepAlive(true);
            StringBuilder mBuf = new StringBuilder();
            PrintWriter pw = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()), true);
            //OutputStreamWriter w = new OutputStreamWriter(socket.getOutputStream());
            BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            Scanner scan = new Scanner(br);
            HashSet<String> hs = new HashSet<String>();
            ArrayList<String> slabs = new ArrayList<String>();
            //String ss = new String("stats items STAT items:0:number 0 END\n");
            pw.println("stats items STAT items:0:number 0 END");
            int c=0;
            while (scan.hasNext()) {
                String s = new String();
                s = scan.nextLine();
                if (s.matches("^STAT.*")) {
                    slabs.add(s.split(":")[1]);
                    //System.out.println(slabs.get(slabs.size() - 1));
                }
                else if (s.matches("^END.*$")) break;
            }

            hs.addAll(slabs); // insert all in hashtable
            slabs.clear(); //clear arraylist
            slabs.addAll(hs); //add unique
            for(String slab: slabs) {
                pw.println(String.format("stats cachedump %s 200000 ITEM", slab));
                int cnt = new Integer(0);
                System.err.print(slab + " ");
                while (scan.hasNext()) {
                    cnt++;
                    String s1 = new String();
                    s1 = scan.nextLine();
                    if (! s1.equals("END") && s1.split(" ").length >= 3)
                        System.out.println(s1.split(" ")[1]);
                        else if (s1.equals("END")) break;
                    }
                    System.err.println(cnt);
                }
        } catch (NumberFormatException nfe) {
            System.err.println("Second argument must be port number, thuse Integer value");
            System.exit(1);
        }
    }
}

Python:

import sys
import telnetlib

def get_all_memcached_keys(host='127.0.0.1', port=11211):
    t = telnetlib.Telnet(host, port)
    t.write('stats items STAT items:0:number 0 END\n')
    items = t.read_until('END').split('\r\n')
    k = set()
    for item in items:
        parts = item.split(':')
        if not len(parts) >= 3:
            continue
        k.add(parts[1])
    for slab in k:
        sys.stderr.write(slab + " ")
        t.write('stats cachedump {0} 200000 ITEM\n'.format(slab))
        cachelines = t.read_until('END').split('\r\n')
        sys.stderr.write(str(len(cachelines)) + "\r\n")
        for line in cachelines:
            parts = line.split(' ')
            if not len(parts) >= 3:
                continue
            print parts[1]
    t.close()

get_all_memcached_keys(sys.argv[1],sys.argv[2])

ところで、私はプログラマーではありません。だから私を悪いコードのせいにしないでください:)

4

0 に答える 0