Главная страница


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)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 Длинная строка   Vladimir Volkov   16 Mar 2003 05:10:26 
 Длинная строка   Ruslan Sulemanov   16 Mar 2003 12:20:49 
 Re: Длинная строка   John Lepikhin   16 Mar 2003 23:12:10 
 Длинная строка   Ruslan Sulemanov   16 Mar 2003 15:54:32 
 Длинная строка   Renat Araslanow   17 Mar 2003 01:51:02 
 Длинная строка   Ruslan Sulemanov   17 Mar 2003 09:20:50 
 Re: Длинная строка   Ivan Frolcov   17 Mar 2003 02:11:18 
 Re: Длинная строка   Konstantin Tokar   17 Mar 2003 20:10:25 
 Re: Длинная строка   Vladimir Volkov   17 Mar 2003 21:51:22 
 Re: Длинная строка   Artem Chuprina   17 Mar 2003 22:20:22 
 Re: Длинная строка   Konstantin Tokar   18 Mar 2003 17:19:21 
 Длинная строка   Ruslan Sulemanov   17 Mar 2003 20:13:45 
 Re: Длинная строка   Konstantin Tokar   18 Mar 2003 17:20:51 
Архивное /ru.perl/12770eaa10169.html, оценка 1 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional