Хотя я опаздываю на четыре года, я думаю, что у меня есть самое быстрое решение. Недавно я написал пакет python под названием linereader , который позволяет вам манипулировать указателями дескрипторов файлов.
Вот простое решение для получения случайной строки с этим пакетом:
from random import randint
from linereader import dopen
length = #lines in file
filename = #directory of file
file = dopen(filename)
random_line = file.getline(randint(1, length))
В первый раз это делается хуже всего, так как linereader должен скомпилировать выходной файл в специальном формате. После этого linereader может получить доступ к любой строке из файла быстро, независимо от размера файла.
Если ваш файл очень маленький (достаточно маленький, чтобы вписаться в MB), вы можете заменить dopen
с copen
, и он делает кэшированную запись файла в памяти. Это происходит не только быстрее, но вы получаете количество строк в файле, поскольку оно загружается в память; это делается для вас. Все, что вам нужно сделать, это создать случайный номер строки. Вот пример кода для этого.
from random import randint
from linereader import copen
file = copen(filename)
lines = file.count('\n')
random_line = file.getline(randint(1, lines))
Я просто очень рад, потому что увидел кого-то, кто мог бы воспользоваться моим пакетом! Извините за мертвый ответ, но пакет определенно может быть применен ко многим другим проблемам.
Я нашел этот ссылка полезный.
Вот абзац, выделяющий некоторых профессионалов/недостатки каждого подхода.
обычно замеченный дизайн должен подражать многим подобным булевской переменной флагам, что словарь данных Oracle просматривает использование, выбирая 'Y' для истинного и 'N' для лжи. Однако для взаимодействия правильно с серверными средами, такими как JDBC, OCCI и другие среды программирования, лучше выбрать 0 для лжи и 1 для истинного, таким образом, это может работать правильно с функциями setBoolean и getBoolean.
В основном они защищают метод номер 2, для пользы эффективности, с помощью [1 112]
getBoolean()
и т.д.) с проверочным ограничением Их пример:
create table tbool (bool char check (bool in (0,1)); insert into tbool values(0); insert into tbool values(1);`
Для использования наименьшего количества суммы пространства, необходимо использовать поле CHAR, ограниченное для 'Y' или 'N'. Oracle не поддерживает БУЛЕВСКУЮ ПЕРЕМЕННУЮ, BIT или Типы данных tinyint, таким образом, один байт CHAR является столь маленьким, как можно добраться.
Или 1/0 или Y/N с проверочным ограничением на него. эфир путь прекрасен. Я лично предпочитаю 1/0, поскольку я делаю большую работу в жемчуге, и это делает действительно легким сделать Логические операции жемчуга на полях базы данных.
, Если Вы хотите действительно подробно обсуждение этого вопроса с одним из главных управляющих Оракулов, проверьте то, что Tom Kyte должен сказать об этом Здесь
База данных я сделал большую часть своей работы над используемым 'Y' / 'N' как булевские переменные. С той реализацией можно осуществить некоторые приемы как:
строки количества, которые верны:
ИЗБРАННАЯ СУММА (СЛУЧАЙ, КОГДА BOOLEAN_FLAG = 'Y' ТОГДА 1 ЕЩЕ 0) ОТ X
При группировке строк, осуществите, "Если одна строка верна, то все - истинная" логика:
ВЫБОР МАКС (BOOLEAN_FLAG) ОТ Y
С другой стороны, используйте МИН для принуждения группирующейся лжи, если одна строка является ложью.
В наших базах данных мы используем перечисление, которое гарантирует, чтобы мы передали его любой TRUE ИЛИ FALSE. Если Вы делаете это любой из первых двух способов, которыми слишком легко или начать добавлять новое значение к целому числу, не проходя надлежащий дизайн, или заканчиваясь с тем символьным полем, имеющим Y, y, N, n, T, t, F, f значения и имеющим необходимость помнить, какой раздел использования кода, который таблица и какую версию истинных это использует.
Сама Oracle использует Y/N для булевых значений. Для полноты нужно отметить, что pl/sql имеет булев тип, это - только таблицы, которые не делают.
при использовании поля, чтобы указать, должна ли запись быть обработана или не, Вы могли бы рассмотреть использование Y и ПУСТОГО УКАЗАТЕЛЯ как значения. Это делает для очень маленького (читайте быстро), индекс, который занимает очень мало места.
nm -D --defined-only
. nm -D
отобразит неопределенные символы и так далее, который является просто шумом, если Вы хотите видеть то, что определяет сам lib.
– Jack Kelly
12 September 2010 в 09:42