mmap путь быстрее. Вы могли бы записать простой сравнительный тест для доказательства его себе:
char data[0x1000];
std::ifstream in("file.bin");
while (in)
{
in.read(data, 0x1000);
// do something with data
}
по сравнению с:
const int file_size=something;
const int page_size=0x1000;
int off=0;
void *data;
int fd = open("filename.bin", O_RDONLY);
while (off < file_size)
{
data = mmap(NULL, page_size, PROT_READ, 0, fd, off);
// do stuff with data
munmap(data, page_size);
off += page_size;
}
Очевидно, я не учитываю детали (как то, как определить, когда Вы достигаете конца файла, если Ваш файл не является несколькими из page_size
, например), но это действительно не должно быть намного более сложно, чем это.
, Если Вы можете, Вы могли бы попытаться разбить свои данные в несколько файлов, которые могут быть mmap () - редактор полностью вместо частично (намного более простого).
Несколько месяцев назад у меня была непродуманная реализация раздвижного окна mmap () - потоковый класс редактора для boost_iostreams, но никто не заботился, и я начал действовать с другим материалом. Больше всего, к сожалению, я удалил архив старых незаконченных проектов несколько недель назад, и это было одной из жертв:-(
Обновление : Я должен также добавить протест, что этот сравнительный тест выглядел бы очень отличающимся в Windows, потому что Microsoft реализовала изящный кэш файла, который делает большую часть того, что Вы сделали бы с mmap во-первых. Т.е. для часто полученных доступ файлов, Вы могли просто сделать станд.:: ifstream.read () и это было бы с такой скоростью, как mmap, потому что кэш файла уже сделает размещение в ОЗУ для Вас, и это прозрачно.
Заключительное Обновление : Посмотрите, люди: через большое количество различных комбинаций платформы ОС и стандартных библиотек и дисков и иерархий памяти, я не могу сказать наверняка, что системный вызов mmap
, просматриваемый как черный квадрат, всегда всегда всегда будет существенно быстрее, чем read
. Это не было точно моим намерением, даже если мои слова могли бы быть истолкованы тот путь. В конечном счете, моя точка была то, что i/o с отображенной памятью обычно быстрее, чем основанный на байте i/o; это все еще верно . Если Вы находите экспериментально, что нет никакого различия между этими двумя, то единственное объяснение, которое кажется разумным мне, состоит в том, что Ваша платформа реализует размещение в ОЗУ под покрытиями способом, которое выгодно для производительности вызовов к read
. Единственный способ быть абсолютно уверенным, что Вы используете i/o с отображенной памятью портативным способом, состоит в том, чтобы использовать mmap
. Если Вы не заботитесь о мобильности, и можно полагаться на представляющие параметры целевых платформ, то использование read
может подойти, не жертвуя в известной мере никакой производительностью.
Редактирование для чистки списка ответа: @jbl:
раздвижное окно mmap звучит интересным. Можно ли сказать немного больше об этом?
Уверенный - я писал библиотеку C++ для Мерзавца (libgit ++, если Вы будете), и я столкнулся с подобной проблемой к этому: Я должен был быть в состоянии открыть большие (очень большие) файлы и не иметь производительность быть общей собакой (как это будет с std::fstream
).
Boost::Iostreams
уже имеет mapped_file Источник, но проблема состояла в том, что это было mmap
, проверяют с помощью ping-запросов целые файлы, который ограничивает Вас 2^ (wordsize). На 32-разрядных машинах 4 ГБ не являются достаточно большими. Весьма разумно ожидать иметь .pack
файлы в Мерзавце, которые становятся намного больше, чем это, таким образом, я должен был считать файл в блоках, не обращаясь к регулярному файлу i/o. Под покрытиями [1 112], я реализовал Источник, который является более или менее другим представлением взаимодействия между [1 113] и std::istream
. Вы могли также попробовать аналогичный подход, просто наследовавшись std::filebuf
в mapped_filebuf
и точно так же наследовавшись std::fstream
в [1 118]. Это - взаимодействие между двумя, в которых это трудно разобраться. Boost::Iostreams
имеет часть работы, сделанной для Вас, и она также обеспечивает рычаги для фильтров и цепочек, таким образом, я думал, что будет более полезно реализовать его тот путь.
По сути, оператор IN создает серию операторов ИЛИ ... так что
SELECT * FROM table WHERE column IN (1, 2, 3)
Фактически
SELECT * FROM table WHERE column = 1 OR column = 2 OR column = 3
И, к сожалению, это путь, по которому вам придется идти со своими операторами LIKE
SELECT * FROM table
WHERE column LIKE 'Text%' OR column LIKE 'Hello%' OR column LIKE 'That%'
Еще один вариант - использовать что-то вроде этого
SELECT *
FROM table t INNER JOIN
(
SELECT 'Text%' Col
UNION SELECT 'Link%'
UNION SELECT 'Hello%'
UNION SELECT '%World%'
) List ON t.COLUMN LIKE List.Col
Вам нужно несколько предложений LIKE, соединенных оператором OR.
SELECT * FROM table WHERE
column LIKE 'Text%' OR
column LIKE 'Link%' OR
column LIKE 'Hello%' OR
column LIKE '%World%' OR
Нет, MSSQL не допускает такие запросы. Вы должны использовать столбец LIKE '...' ИЛИ столбец LIKE '...'
и т. Д.
Нет, вам придется использовать ИЛИ
, чтобы объединить ваши LIKE
утверждения:
SELECT
*
FROM
table
WHERE
column LIKE 'Text%' OR
column LIKE 'Link%' OR
column LIKE 'Hello%' OR
column LIKE '%World%'
Вы просматривали полнотекстовый поиск ?