Производительность Linux/perl mmap

На самом деле, alloca не гарантирует использование стека. Действительно, реализация alloca в gcc-2.95 выделяет память из кучи, используя сам malloc. Кроме того, эта реализация содержит ошибки, это может привести к утечке памяти и неожиданному поведению, если вы вызовете ее внутри блока с дальнейшим использованием goto. Нет, чтобы сказать, что вы никогда не должны его использовать, но иногда alloca приводит к большим накладным расходам, чем освобождает от фрома.

10
задан Marius Kjeldahl 27 June 2009 в 12:50
поделиться

8 ответов

Хорошо, проблема обнаружена. Как и предполагалось, ни Linux, ни Perl не виноваты. Чтобы открыть файл и получить к нему доступ, я делаю что-то вроде этого:

#!/usr/bin/perl
# Create 1 GB file if you do not have one:
# dd if=/dev/urandom of=test.bin bs=1048576 count=1000
use strict; use warnings;
use Sys::Mmap;

open (my $fh, "<test.bin")
    || die "open: $!";

my $t = time;
print STDERR "mmapping.. ";
mmap (my $mh, 0, PROT_READ, MAP_SHARED, $fh)
    || die "mmap: $!";
my $str = unpack ("A1024", substr ($mh, 0, 1024));
print STDERR " ", time-$t, " seconds\nsleeping..";

sleep (60*60);

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

Ошибка заключалась в том, что я в своем коде обработал скаляр $ mh как дескриптор, что-то легкое и легко перемещаемое (читай: передача по значению). Оказывается, на самом деле это длинная строка в ГБ, определенно не то, что вы хотите перемещать без создания явной ссылки (perl lingua для «указателя» / значения дескриптора). Поэтому, если вам нужно сохранить в хэше или подобном, убедитесь, что вы сохранили \ $ mh ,

16
ответ дан 3 December 2019 в 15:36
поделиться

Если вы у вас относительно последняя версия Perl, вам не следует использовать Sys :: Mmap. Вы должны использовать слой PerlIO mmap .

Можете ли вы опубликовать код, который вы используете?

8
ответ дан 3 December 2019 в 15:36
поделиться

On 32-bit systems the address space for mmap()s is rather limited (and varies from OS to OS). Be aware of that if you're using multi-gigabyte files and your are only testing on a 64-bit system. (I would have preferred to write this in a comment but I don't have enough reputation points yet)

3
ответ дан 3 December 2019 в 15:36
поделиться

Звучит удивительно. Почему бы не попробовать чистую версию C?

Или попробовать свой код в другой версии OS / perl.

0
ответ дан 3 December 2019 в 15:36
поделиться

См. Wide Finder для получения информации о производительности Perl с mmap. Но есть одна большая ошибка. Если ваш набор данных будет на классическом HD, и вы будете читать из нескольких процессов, вы легко можете попасть в режим произвольного доступа, и ваш IO упадет до неприемлемых значений (20-40 раз).

0
ответ дан 3 December 2019 в 15:36
поделиться

Хорошо, вот еще одно обновление. Использование атрибута Sys :: Mmap или PerlIO ": mmap" отлично работает в Perl, но только для файлов размером до 2 ГБ (магический предел в 32 бита). Когда размер файла превышает 2 ГБ, возникают следующие проблемы:

Использование Sys :: Mmap и substr для доступа к файлу, кажется, что substr принимает только 32-битное int в качестве параметра позиции, даже в системах, где Perl поддерживает 64 бит. Там' s по крайней мере одна ошибка сообщена об этом:

# 62646: Максимальная длина строки с substr

Использование open (my $ fh, "<: mmap", "bigfile.bin") , один раз размер файла превышает 2 ГБ, кажется, что perl либо зависнет, либо будет настаивать на чтении всего файла при первом чтении (не уверен, что именно, я никогда не запускал его достаточно долго, чтобы увидеть, завершился ли он), что приводит к очень низкой производительности.

Я не нашел никакого обходного пути ни для одного из них, и в настоящее время я застрял с медленными файловыми операциями (без использования mmap) для работы с этими файлами. Если я не найду обходной путь, мне, возможно, придется реализовать обработку на C или другом языке более высокого уровня, который лучше поддерживает mmap'ing огромных файлов.

) , если размер файла превышает 2 ГБ, кажется, что perl либо зависнет /, либо будет настаивать на чтении всего файла при первом чтении (не уверен, что, я никогда не запускал его достаточно долго, чтобы увидеть, завершился ли он), что приводит к крайне низкой производительности.

Я не нашел никакого обходного пути ни для одного из них, и в настоящее время я застрял с медленными файловыми (не mmap'ed) операциями для работы с этими файлами. Если я не найду обходной путь, мне, возможно, придется реализовать обработку на C или другом языке более высокого уровня, который лучше поддерживает mmap'ing огромных файлов.

) , если размер файла превышает 2 ГБ, кажется, что perl либо зависнет /, либо будет настаивать на чтении всего файла при первом чтении (не уверен, что, я никогда не запускал его достаточно долго, чтобы увидеть, завершился ли он), что приводит к крайне низкой производительности.

Я не нашел никакого обходного пути ни для одного из них, и в настоящее время я застрял с медленными файловыми (не mmap'ed) операциями для работы с этими файлами. Если я не найду обходной путь, мне, возможно, придется реализовать обработку на C или другом языке более высокого уровня, который лучше поддерживает mmap'ing огромных файлов.

m в настоящее время застрял с медленными файловыми (не mmap'ed) операциями для работы с этими файлами. Если я не найду обходной путь, мне, возможно, придется реализовать обработку на C или другом языке более высокого уровня, который лучше поддерживает mmap'ing огромных файлов.

m в настоящее время застрял с медленными файловыми (не mmap'ed) операциями для работы с этими файлами. Если я не найду обходной путь, мне, возможно, придется реализовать обработку на C или другом языке более высокого уровня, который лучше поддерживает mmap'ing огромных файлов.

0
ответ дан 3 December 2019 в 15:36
поделиться

Одна вещь, которая может улучшить производительность, - это использование madvise (2). наверное проще всего выполняется через Inline :: C. 'madvise' позволяет вам сообщить ядру, каким будет ваш шаблон доступа (например, последовательный, случайный и т. д.).

1
ответ дан 3 December 2019 в 15:36
поделиться

«Отсоединить все» оставит процесс запущенным. «Остановить отладку» (обычно) уничтожит локальный процессы. Следует отметить, что они в значительной степени работают одинаково, если вы используете удаленную отладку.

Отсоединить отладчик ...

«Отсоединение от процесса не завершает процесс. Процесс продолжает работать на своем главном компьютере, даже если он больше не привязан к отладчику ". - MSDN

Остановить отладку ...

«Остановить отладку завершает отлаживаемый процесс, если программа была запущена из Visual Studio. Если вы подключились к процессу, вместо того, чтобы запускать его из Visual Studio, процесс продолжает работать. Если вы хотите завершить присоединенные процессы,

0
ответ дан 3 December 2019 в 15:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: