Pregunta

Me han encargado con la creación de una base de datos de archivo plano SKU para su uso en dispositivos embebidos con almacenamiento limitado y la velocidad del procesador.

Básicamente los datos que necesito para almacenar consiste en lo siguiente:

SKU Descripción Ubicación Precio Cantidad

El archivo estará formado por varios millones de registros.

Las consideraciones más importantes son el espacio de almacenamiento y tiempo de recuperación. sólo necesitarán registros para ser recuperados por SKU y será de sólo lectura, por lo que el archivo puede ser ordenado por código de artículo.

Me gustaría acceder a estos datos con Python. Así que mi pregunta se reduce a esto.

¿Hay bibliotecas Python existentes que pueden proporcionar esta funcionalidad para mí, o tengo que rodar mi propia?

Si la respuesta se reduce a rodar la mía, ¿alguien tiene una sugerencia, o buenas referencias para hacerlo?

¿Fue útil?

Solución

¿Qué hay de SQLite con enlaces Python? Tiene un poco más de lo necesario, pero es el software estándar y bien probado.

Otros consejos

La vieja manera sería utilizar una sencilla tabla de datos clave / valor como módulo gdbm. Python viene con soporte para eso, pero no está integrado en la instalación de Python por defecto en mi máquina.

En general, utilizar SQLite. Como escribieron otros, viene de serie con Python, y se utiliza en una gran cantidad de sistemas embebidos ya.

Si los registros son de longitud fija, puede utilizar el módulo bisect. El tamaño del archivo / el tamaño del registro indica el número de registros en el archivo. La búsqueda bisect hará un O (log (n)) de búsqueda en el archivo, y usted tiene que escribir un adaptador para comprobar la igualdad. Aunque no he probado, esto es un boceto:

import bisect

RECORD_SIZE = 50

class MatchFirst10Chars(object):
    def __init__(self, word):
        self.word = word
    def __lt__(self, other):
        return self.word < other[:10]

class FileLookup(object):
    def __init__(self, f):
        self.f = f
        f.seek(0, 2)
        self.size = f.tell() // RECORD_SIZE
    def __len__(self):
        return self.size

    def __getitem__(self, i):
        self.f.seek(i*RECORD_SIZE)
        return self.f.read(RECORD_SIZE)


SKU = "123-56-89 "
f = open("data_file")
fl = FileLookup(f)
i = bisect.bisect(fl, MatchFirst10Chars(SKU))

Se podría gzip, además, el archivo y buscar en un archivo gzip'ped, pero eso es una desventaja para el espacio en función del tiempo que usted tiene que probar.

CDB ? (Enlaces Python:. python-cdb )

Es un formato utilizado para los datos de sólo lectura, como que tiene; que es, básicamente, 256 tablas hash gigantes, cada uno capaz de tener un número diferente de cubos. Lo bueno de CDB es que el archivo no tiene que ser cargado en la memoria; está estructurado de manera que se puede realizar búsquedas con sólo mmaping en los bits que necesita.

El CDB especificación es una buena lectura, entre otras cosas porque las líneas están formateados para crear un margen derecho uniforme. -D

¿Qué hay de HDF ? Si usted no necesita SQL y necesita un acceso rápido a los datos, no hay nada más rápido ... ... en Python para datos numéricos o estructurados.

Tome un vistazo a la DatabaseInterfaces sección en el Python wiki nofollow noreferrer. Es integral. Hay un par de opciones "puros" Python enumerados (como SnakeSQL ), que son un poco más agradable desplegar. Y, por supuesto, siempre hay Berkeley DB y similares, que son super delgado y prima.

Sinceramente, SQLite, probablemente no tendrán ningún problema para usted. Si realmente necesita eek más rendimiento, entonces lo que se busca en un formato basado en disco como BDB.

Una solución simple es cPickle . También se puede encontrar preguntas similares el SO.

Una variación de la respuesta de Andrew Dalke (por lo que aún puede utilizar la búsqueda binaria para localizar el SKU rápidamente) que puede reducir los requisitos de espacio sería tener registros de tamaño fijo en el inicio del archivo (uno por SKU) y luego, las descripciones y las ubicaciones (como terminada en nulo cadenas dicen)

Tienes la oportunidad de ahorrar espacio al no tener de disolución de los lugares y las descripciones de longitud fija. También se puede ahorrar espacio si hay un montón de lugares duplicados

Aquí es un ejemplo: supongamos que tiene

SKU         16 bytes
Description Variable length
Location    Variable length
Price       4 bytes (up to $42949672.95)
Quantity    4 bytes (up to 4294967295)



 offset          SKU        desc_off   loc_off      Price      Quantity
0x00000000 SKU0000000000001 0x01f78a40 0x01f78a47  0x000003e8  0x000f4240
0x00000020 SKU0000000000002 0x01f78a53 0x01f78a59    ...
...
... # 999998 more records
...
0x01f78a40 Widget\x00
0x01f78a47 Head office\x00
0x01f78a53 Table\x00
0x01f78a59 Warehouse\x00
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top