Файловая операция медленнее, есть ли более быстрый метод поиска в Python? - PullRequest
0 голосов
/ 11 марта 2012

Я сохраняю значения приведенной ниже формы в файл:

143   800 'Ask'
213   457 'Comment'
424   800 'Hi'

Первый столбец содержит уникальные элементы.Тем не менее, поиск значений первого столбца довольно неэффективен, когда я храню его в формате файла, есть ли более эффективный способ в Python для более быстрого поиска.Мне известны словари в python для этого, но я ищу какой-то другой метод.Поскольку данные у меня состоят из триллионов записей .. поэтому я не могу хранить их в словаре в оперативной памяти.Поэтому я ищу какой-то другой метод.Также с каждым исключением программы строки будут вставляться в случае баз данных, как это преодолеть, пример того, что я путаю в базах данных, приведен ниже:

 143   800 'Ask'
 213   457 'Comment'
 424   800 'Hi'
 143   800 'Ask'
 213   457 'Comment'
 424   800 'Hi'

Ответы [ 5 ]

2 голосов
/ 11 марта 2012

Вот полный пример кода с использованием sqlite3, показывающий, как инициализировать базу данных, поместить в нее данные и получить одну строку данных.

import sqlite3

conn = sqlite3.connect(':memory:')
conn.execute("""CREATE TABLE Widget (id INTEGER PRIMARY KEY,
                                     serial_number INTEGER,
                                     description TEXT);""")

my_data = [ [143, 800, 'Ask'],
            [213, 457, 'Comment'],
            [424, 800, 'Hi'] ]

for row in my_data:
    conn.execute("INSERT INTO Widget (id, serial_number, description) VALUES (?,?,?);" , row )

conn.commit() # save changes

res = conn.execute("SELECT * FROM Widget WHERE id=143")
row = res.next()
print row #prints (143, 800, u'Ask')

Обратите внимание на использование специального имени файла:memory: чтобы открыть временную базу данных.

1 голос
/ 11 марта 2012

То, что вы просите, вероятно, называется «таблицей базы данных» и «индексом».Классический подход заключается в наличии дополнительного файла (индекса), который отображает ключи кортежей данных в таблице на абсолютные позиции кортежей в файле.

0 голосов
/ 11 марта 2012

Также при каждом запуске программы будут вставляться строки

Если вы хотите сохранить хранилище в файле, как вы это делаете, то простое решение для предотвращенияповторяющиеся записи при появлении следующего выполнения будут просто усекать файл первым.Вы можете сделать это, открыв его с флагом w:

f = open('filename', 'w')
# ...
f.close()

Однако это звучит так, как будто вы просто хотите сохранить некоторые данные , пока программа выполняется, т.е. выхотите хранить данные, не делая их постоянными.Если это так, то мне интересно, почему вы на самом деле храните содержимое в файле.

Более очевидный способ, который также является pythonic (хотя и не является особенным для Python), состоит в том, чтобы сохранить его всловарь во время выполнения программы.Словарь является изменяемым, поэтому вы можете постоянно изменять его содержимое: вы можете добавлять новые записи или даже обновлять записи, если впоследствии вы получите больше информации о них.

Я знал об этом из хранилищав словаре, но иногда у меня нет значений для значений [143] [1], то есть строка 'None' хранится на своем месте

Это совсем не проблема.Вы можете легко сохранить запись с 143 в качестве ключа и None в качестве его значения или даже массивом None значений:

>>> values[143] = [ None, None ]

Таким образом, словарь по-прежнему будет помнить, что вывведите ключ, поэтому проверка, находится ли ключ в словаре, вернет true:

>>> 143 in values
True

Есть ли другой способ, кроме словарей в python для выполнения того же, я знал о словарях... Я просто ищу какой-то другой способ.

Нет, обычно есть только один способ сделать что-то прямо в Python, как также сказал Zen of Python : «Должен быть один - и желательно только один - очевидный способ сделать это».

Таким образом, нет, вероятно, нет подходящегоспособ использования словарей без словарей.Но опять же, почему вы ищете какой-то другой путь?Для меня это не звучит, как будто у вас есть веская причина для этого, и если у вас есть, вы должны обязательно объяснить, почему некоторые способы нежелательны для вас.

0 голосов
/ 11 марта 2012

Если вам нужно поискать вещи в постоянном хранилище, используйте базу данных.Одним из примеров является sqlite , который является встроенным.

0 голосов
/ 11 марта 2012

Я не понимаю, вы хотите иметь возможность быстрее искать в самом файле или с содержимым файла в python? В последнем случае используйте словарь с уникальными элементами в качестве ключа.

values = {143:[800,'ask'], 213:[457,'Comment'], 424:[800:'Hi']}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...