Antecedentes: soy un principiante cuando se trata de servidores, pero conozco bien la programación en Python.Variable global en el servidor de Python
Estoy intentando configurar un servidor simple utilizando los módulos básicos de Python 2.7 (SimpleHTTServer, CGIHTTPServer, etc.). Este servidor necesita cargar una variable global de solo lectura con varios GB de datos de un archivo cuando se inicia; luego, cuando cada usuario accede a la página, el servidor utiliza los datos grandes para generar algún resultado que luego se le entrega al usuario.
Por el bien de ejemplo, supongamos que tengo un archivo de 4 GB names.txt
que contiene todos los posibles nombres propios de Inglés:
Jack
John
Allison
Richard
...
Supongamos que mi objetivo es leer toda la lista de nombres en la memoria , y luego elija 1 nombre al azar de esta gran lista de nombres propios. Actualmente puedo usar el módulo nativo CGIHTTPServer de Python para lograr esto. Para empezar, acabo de ejecutar el módulo CGIHTTPServer directamente, mediante la ejecución de un terminal:
python -m CGIHTTPServer
Entonces, alguien accede www.example-server.net:8000/foo.py
y ellos se dan uno de estos nombres al azar. Tengo el siguiente código en foo.py
:
#!/usr/bin/env python
import random
name_list = list()
FILE = open('names.txt','r')
for line in FILE:
name = line[:-1]
name_list.append(name)
FILE.close()
name_to_return = random.choice(name_list)
print "Content-type: text/html"
print
print "<title>Here is your name</title>"
print "<p>" + name_to_return + "</p>"
Esto hace lo que yo quiero; sin embargo, es extremadamente ineficiente, porque cada acceso obliga al servidor a volver a leer un archivo de 4 GB.
¿Cómo puedo convertir esto en un proceso eficiente, donde la variable name_list
se crea como global inmediatamente cuando se inicia el servidor, y cada acceso solo se lee desde esa variable?
Gracias por la respuesta. Las bases de datos están en mi lista de cosas para aprender, pero parece una exageración completa solo por esta necesidad. – HerrKaputt
De acuerdo, entonces posiblemente intentaría generar un número aleatorio y solo leer esa línea del archivo. De esta forma, no es necesario pasar por todas las líneas. – edhedges
Eso funcionaría para este simple ejemplo. Sin embargo, no funcionaría para la aplicación que tengo en mente, que realmente requiere leer todo el archivo en la memoria. Obviamente, ese malentendido no es tu culpa. Editaré la pregunta original para reflejar eso. – HerrKaputt