Pergunta

Agora, eu estou tamponamento bytes utilizando cordas, StringIO, ou cStringIO. Mas, muitas vezes eu preciso remover bytes a partir do lado esquerdo do buffer. Uma alternativa seria reconstruir todo o buffer. Existe uma ótima maneira de fazer isso, se deixou-truncando é uma operação muito comum? coletor de lixo do Python deve realmente GC os bytes truncado.

Qualquer tipo de algoritmo para isso (manter o buffer em pequenos pedaços?), Ou uma implementação existente, seria realmente ajudar.

Editar:

Eu tentei usar memoryview Python 2.7 é para isso, mas, infelizmente, os dados fora da "vista" não é GCed quando a referência original é apagado:

# (This will use ~2GB of memory, not 50MB)

memoryview # Requires Python 2.7+

smalls = []

for i in xrange(10):
    big = memoryview('z'*(200*1000*1000))
    small = big[195*1000*1000:]
    del big
    smalls.append(small)
    print '.',
Foi útil?

Solução

A deque será eficiente se as operações de remoção de esquerda são frequente (Ao contrário de usar uma lista, corda ou tampão, é amortizado ó (1) para remoção de qualquer extremidade). Ele vai ser mais caro memory-sábio do que uma corda no entanto, como você vai estar armazenando cada personagem como seu próprio objeto de cadeia, em vez de uma seqüência embalado.

Como alternativa, você pode criar sua própria implementação (ex. Uma lista ligada de corda / buffer objetos de tamanho fixo), que pode armazenar os dados de forma mais compacta.

Outras dicas

Construa seu buffer como uma lista de caracteres ou linhas e cortar da lista. juntar-se apenas como corda na saída. Isso é muito eficiente para a maioria dos tipos de comportamento mutável string '.

O GC irá recolher os bytes truncado porque já não são referenciados na lista.

UPDATE: Para modificar a cabeça lista você pode simplesmente reverter a lista. Isso soa como uma coisa ineficiente para fazer no entanto implementação da lista de python otimiza isso internamente.

http://effbot.org/zone/python-list.htm:

A inversão é rápido, então temporariamente revertendo a lista pode muitas vezes velocidade as coisas se você precisa remover e inserir um monte de itens no início da lista:

L.reverse()
# append/insert/pop/delete at far end
L.reverse()
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top