zoukankan      html  css  js  c++  java
  • How to read very large text files fast

    Question
    Does anyone know the fastest way to read large text files (10Mb) into a string.Readln is just too slow.
     

    Answer 1

    You may try this:

    function R(const FileName: string): string;
    var
      M: TFileStream;
    begin
      M := TFileStream.Create(FileName, fmOpenRead);
      try
        SetLength(Result, M.Size);
        M.Read(Result[1], M.Size);
      finally
        M.Free;
      end;
    end;

    Answer 2

    As an alternative to Christian's suggestion, you can also use a memory-mapped file:

    function MMFileToString(const AFilename: string): string;
    var
      hFile: THandle;
      hFileMap: THandle;
      hiSize: DWORD;
      loSize: DWORD;
      text: string;
      view: pointer;
    begin
      Result := '';
      if AFilename = '' then
        Exit;
      if not FileExists(AFilename) then
        Exit;
      {Open the file}
      hFile := CreateFile(
        PChar(AFilename), GENERIC_READ, FILE_SHARE_READ, nil,
        OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0
      );
      if hFile <> INVALID_HANDLE_VALUE then
      begin
        loSize := GetFileSize(hFile, @hiSize);
        {File was opened successfully, now map it:}
        hFileMap := CreateFileMapping(
          hFile, nil, PAGE_READONLY, hiSize, loSize, 'TextForString'
        );
        if (hFileMap <> 0) then
        begin
          if (GetLastError() = ERROR_ALREADY_EXISTS) then
          begin
            MessageDlg(
              'Mapping already exists - not created.', mtWarning, [mbOk], 0
            );
            CloseHandle(hFileMap)
          end
          else
          begin
            try
              {File mapped successfully, now map a view of the file into the
              address space:}
              view := MapViewOfFile(hFileMap, FILE_MAP_READ, 0, 0, 0);
              if (view <> nil) then
              begin {View mapped successfully}
                {Close file handle - as long is view is open it will persist}
                CloseHandle(hFile);
                SetLength(Result, loSize);
                Move(view^, Result[1], loSize);
              end
              else
                MessageDlg(
                  'Unable to map view of file. ' + SysErrorMessage(GetLastError),
                  mtWarning, [mbOk], 0
                );
            finally
              UnmapViewOfFile(view);  {Close view}
              CloseHandle(hFileMap);  {Close mapping}
            end
          end
        end
        else
        begin
          MessageDlg(
            'Unable to create file mapping. ' + SysErrorMessage(GetLastError),
            mtWarning, [mbOk], 0
          );
        end;
      end
      else
      begin
        MessageDlg(
          'Unable to open file. ' + SysErrorMessage(GetLastError),
          mtWarning, [mbOk], 0
        );
      end;
    end;
  • 相关阅读:
    操作系统01_进程和线程管理
    数据库02_字段类型
    鲁滨逊漂流记游戏
    查找数N二进制中1的个数(JS版 和 Java版)
    js中的call、apply
    jQuery对象与Dom对象的相互转换
    jndi配置数据源
    关于JS中变量的作用域-实例
    重写equals()方法时,需要同时重写hashCode()方法
    String与StringBuilder
  • 原文地址:https://www.cnblogs.com/shangdawei/p/4036500.html
Copyright © 2011-2022 走看看