你在做什麼是建立在已經:
s = "i am a string!".encode('hex')
# what you do
r = ""
for i in xrange(0, len(s), 2) :
r += chr(int(s[i:i+2], 16))
# but decoding is builtin
print r==s.decode('hex') # => True
正如你可以看到你的整個解碼s.decode('hex')
。
但「懶惰」的解碼聽起來像是對我不成熟的優化。你需要千兆字節的數據才能注意到它。嘗試分析,.decode
比舊代碼快50倍。
也許你想的財產以後這樣的:
class DB(object): # dunno what data it is ;)
def __init__(self, data):
self.data = data
self.decoded = {} # maybe cache if the field data is long
def __getitem__(self, name):
try:
return self.decoded[name]
except KeyError:
# this copies the fields data
self.decoded[name] = ret = self.data[ self._get_field_slice(name) ].decode('hex')
return ret
def _get_field_slice(self, name):
# find out what part to decode, return the index in the data
return slice(...)
db = DB(encoded_data)
print db["some_field"] # find out where the field is, get its data and decode it
我正在寫一個記錄閱讀器,一旦記錄完成處理後記錄超出範圍,所以我不認爲創建該對象會是一個問題,只是解碼很慢。你有其他想法嗎? – 2009-11-02 03:52:28
當你處理數萬億字節時,一切都是問題。從BOF讀到EOF是一個問題。我希望能夠從中找出基準。就像,你可能可以通過使用'array.fromfile()'將大塊數據讀入數組,然後使用指針處理數組來避免創建對象,並且只有當你將數據從數組中複製出來已經確定了你感興趣的內容。如果不知道更多關於你的應用的信息,很難理解。 – 2009-11-02 05:35:17
我實際上是通過HDFS使用CSV記錄格式讀取Hadoop上的所有內容。由於我在數千臺計算機上運行,因此單個文件沒有太多數據。我實際上爲這種格式編寫了一個lex和yacc解析器:http://github.com/ptarjan/hadoop_record。我認爲'ply'在解析時在內存中使用了一個字符串緩衝區,但我不確定。 – 2009-11-02 20:03:56