Tengo un archivo de texto de 384MB con 50 millones de líneas. Cada línea contiene 2 enteros separados por espacios: una clave y un valor. El archivo está ordenado por clave. Necesito una forma eficiente de buscar los valores de una lista de aproximadamente 200 claves en Python.Leer archivo enorme en Python
Mi enfoque actual se incluye a continuación. Tarda 30 segundos. Debe haber un Foo de Python más eficiente para llevar esto a una eficiencia razonable de un par de segundos como máximo.
# list contains a sorted list of the keys we need to lookup
# there is a sentinel at the end of list to simplify the code
# we use pointer to iterate through the list of keys
for line in fin:
line = map(int, line.split())
while line[0] == list[pointer].key:
list[pointer].value = line[1]
pointer += 1
while line[0] > list[pointer].key:
pointer += 1
if pointer >= len(list) - 1:
break # end of list; -1 is due to sentinel
Coded búsqueda binaria + buscar una solución (gracias kigurai!):
entries = 24935502 # number of entries
width = 18 # fixed width of an entry in the file padded with spaces
# at the end of each line
for i, search in enumerate(list): # list contains the list of search keys
left, right = 0, entries-1
key = None
while key != search and left <= right:
mid = (left + right)/2
fin.seek(mid * width)
key, value = map(int, fin.readline().split())
if search > key:
left = mid + 1
else:
right = mid - 1
if key != search:
value = None # for when search key is not found
search.result = value # store the result of the search
Me gustaría ver tu solución final, ya que parece que la compones a partir de respuestas que no proporcionan el código. –
Agregado al final de la pregunta – marcog