|
|
ru.perl- RU.PERL ---------------------------------------------------------------------- From : Konstantin Tokar 2:5020/400 18 Mar 2003 17:19:21 To : Vladimir Volkov Subject : Re: Длинная строка --------------------------------------------------------------------------------
>>>Требуется произвести поиск по строке в ~23 млн. символов. Строка - в
>>>файле. При попытке прочитать в переменную вылетает со словами 'Out of
>>>memory' (Perl 5.005, Win 98, 128 Mb памяти). Что посоветуете?
>>
>
> KT> В 21 веке для обработки файлов принято использовать отображаемые
> KT> файлы (mmap в юниксе) - написать программу поиска на С, и вызывать
>
> А в Win32?
>
> KT> её из перлово1 программы как CGI скрипт, например
>
> KT> my @search = `my_search 23Mbfile pattern1 pattern2`
В win32 это жутко развесистей, не в последнюю очередь за счёт разных
заморочек с безопасностью и т.д.
CreateFile
CreateFileMapping
MapViewOfFile
...
UnmapViewOfFile
Довольно громоздко, но, например, можно запретить кэширование файловой
системой.
Я когда-то сделал на паскале модулёк, правда не помню, тестировал и
использовал ли его, но на первый взгляд он всё описывает правильно:
unit mmap;
interface
uses windows;
function mmap_open ( filename : string; dwDesiredAccess, dwShareMode:
DWORD ):pointer;
function mmap_close( var p : pointer) : boolean;
implementation
function mmap_open ( filename : string; dwDesiredAccess, dwShareMode:
DWORD ):pointer;
var
h : THANDLE;
// dwDesiredAccess, dwShareMode: DWORD;
lpSecurityAttributes: PSecurityAttributes;
dwCreationDisposition, dwFlagsAndAttributes: DWORD;
hTemplateFile: THandle;
h2 : THandle;
// hFile: THandle;
lpFileMappingAttributes: PSecurityAttributes;
flProtect, dwMaximumSizeHigh, dwMaximumSizeLow: DWORD;
lpName: PChar;
p :Pointer;
// dwDesiredAccess: DWORD;
dwFileOffsetHigh, dwFileOffsetLow, dwNumberOfBytesToMap: DWORD;
begin
lpSecurityAttributes := nil;
dwCreationDisposition := OPEN_EXISTING ;
dwFlagsAndAttributes := FILE_ATTRIBUTE_NORMAL;
hTemplateFile := 0;
h := CreateFile(
PChar(filename+#0),
dwDesiredAccess,
dwShareMode,
lpSecurityAttributes, // lpSecurityAttributes,
dwCreationDisposition, // how to create
dwFlagsAndAttributes, // file attributes
hTemplateFile // handle to file with attributes to copy
);
if h = INVALID_HANDLE_VALUE then
begin
Result := nil;
exit;
end;
lpFileMappingAttributes := nil;
flProtect := 0;
if dwDesiredAccess and GENERIC_READ = GENERIC_READ then flProtect :=
PAGE_READONLY;
if dwDesiredAccess and GENERIC_WRITE = GENERIC_WRITE then flProtect :=
PAGE_READWRITE;
// flProtect := PAGE_READWRITE;
dwMaximumSizeHigh := 0;
dwMaximumSizeLow := 0;
lpName := nil;
h2 := CreateFileMapping(
h, // handle to file to map
lpFileMappingAttributes, // optional security attributes
flProtect, // protection for mapping object
dwMaximumSizeHigh, // high-order 32 bits of object size
dwMaximumSizeLow, // low-order 32 bits of object size
lpName // name of file-mapping object
);
// if GetLastError = ERROR_ALREADY_EXISTS then return nil;
CloseHandle(h);
if h2 = 0 then
begin
Result := nil;
exit;
end;
dwFileOffsetHigh := 0;
dwFileOffsetLow := 0;
dwNumberOfBytesToMap := 0;
if dwDesiredAccess and GENERIC_READ = GENERIC_READ then dwDesiredAccess
:= FILE_MAP_READ;
if dwDesiredAccess and GENERIC_WRITE = GENERIC_WRITE then
dwDesiredAccess := FILE_MAP_ALL_ACCESS;
// dwDesiredAccess := FILE_MAP_ALL_ACCESS;
p := MapViewOfFile(
h2, // file-mapping object to map into address space
dwDesiredAccess, // access mode
dwFileOffsetHigh, // high-order 32 bits of file offset
dwFileOffsetLow, // low-order 32 bits of file offset
dwNumberOfBytesToMap // number of bytes to map
);
CloseHandle(h2);
Result := p;
end;
function mmap_close( var p : pointer) : boolean;
begin
Result := UnmapViewOfFile(p);
p := nil;
end;
end.
--- ifmail v.2.15dev5
* Origin: Demos online service (2:5020/400)
Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.perl/12770eaa10169.html, оценка из 5, голосов 10
|