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])
ところで、私はプログラマーではありません。だから私を悪いコードのせいにしないでください:)