파일 작업. - 페이지 3

 
Yedelkin :
"파일이 닫히면 데이터가 자동으로 디스크에 플러시되므로 FileClose() 함수를 호출하기 전에 FileFlush() 함수를 호출할 필요가 없습니다." - 예, sergeev 가 말하는 내용을 이해하기 시작했습니다. FileClose() 대신 파일의 마지막 레코드 보존을 보장하기 위해 FileFlush()를 호출합니까? 그리고 그것이 현명한 결정이 될까요?

대신이 아니라 필요에 따라.

플러시 - 나머지 데이터를 플러시하고 파일을 닫지 않습니다 . 너가 원하는게 그거야?

닫기 - 나머지 데이터를 디스크로 플러시하고 닫습니다.

 
sergeev :

대신이 아니라 필요에 따라.

플러시 - 나머지 데이터를 플러시하고 파일을 닫지 않습니다 . 너가 원하는게 그거야?

닫기 - 나머지 데이터를 디스크로 플러시하고 닫습니다.

예, 그것이 바로 우리가 말하는 것입니다. 올바른 솔루션에 대한 팁 감사합니다!
 
Yedelkin :

FileFlush()를 사용하여 시간을 최소화하는 것이 잘 작동하지 않습니다.

2011.05.29 21:58:20 FlushSave (EURGBP,M1) FileFlush. GetTickCount() = 133766
2011.05.29 22:00:33 FlushSave (EURGBP,M1) 파일 닫기. GetTickCount() = 133734
사실, 두 함수 모두 실행하는 데 같은 시간이 걸립니다.

내가 알기로는 이 줄은 오프셋 없이 파일의 시작 부분으로 위치를 이동합니다. 이를 통해 기존 정보를 덮어쓸 수 있습니다(즉, 날짜가 업데이트되지만 파일에 누적되지 않음)

 FileSeek (handle_file, 0 , SEEK_SET );

이 때 SEEK_SET 대신 파일의 끝으로 트랜지션을 사용하면 파일에 데이터가 누적된다.

 
Yedelkin :

플러시할 때마다 새 파일 핸들을 엽니다. 무엇 때문에? 그리고 닫지 마세요.

FileFlush 기능의 장점은 핸들을 다시 열 필요가 없다는 것입니다.

Документация по MQL5: Файловые операции / FileFlush
Документация по MQL5: Файловые операции / FileFlush
  • www.mql5.com
Файловые операции / FileFlush - Документация по MQL5
 
Interesting :

1. 내가 알기로는 이 줄은 오프셋 없이 파일의 위치를 이동합니다. 기존 정보를 덮어쓸 수 있는 항목(예: 날짜가 업데이트되었지만 파일에 누적되지 않음)

이 때 SEEK_SET 대신 파일의 끝으로 트랜지션을 사용하면 파일에 데이터가 누적된다.
이미 내 게시물을 삭제했습니다. 거기에 예제에서는 파일에 쓴 후 FileFlush()를 삽입했습니다.
 
TheXpert :

플러시할 때마다 새 파일 핸들을 엽니다. 무엇 때문에? 그리고 닫지 마세요.

FileFlush 기능의 장점은 핸들을 다시 열 필요가 없다는 것입니다.

다음과 같이 했습니다.

 int handle_file;
datetime t;
uint u;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart ()
  {
//---пример с функцией FileFlush()
   u= GetTickCount ();
   handle_file= FileOpen ( "Ye_file.txt" , FILE_READ | FILE_WRITE | FILE_TXT );
//for(int i=0;i<100000;i++)
   for ( int i= 0 ;i< 1000 ;i++)
     {
       if (handle_file!= INVALID_HANDLE )
        {
         t= TimeLocal ();
         FileSeek (handle_file, 0 , SEEK_SET );
         FileFlush (handle_file);
         FileWrite (handle_file,t);
        }
     }
   FileClose (handle_file);
   Print ( "FileFlush. GetTickCount() = " , GetTickCount ()-u);

//---пример без функции FileFlush()
   u= GetTickCount ();
   for ( int i= 0 ;i< 1000 ;i++)
     {
      handle_file= FileOpen ( "Ye_file.txt" , FILE_READ | FILE_WRITE | FILE_TXT );
       if (handle_file!= INVALID_HANDLE )
        {
         t= TimeLocal ();
         FileSeek (handle_file, 0 , SEEK_SET );
         FileWrite (handle_file,t);
         FileClose (handle_file);
        }
     }
   Print ( "FileClose. GetTickCount() = " , GetTickCount ()-u);
  }

결과:

2011.05.29 23:14:31 FlushSave (EURGBP,M1) FileFlush. GetTickCount() = 13563
2011.05.29 23:14:32 FlushSave (EURGBP,M1) 파일 닫기. GetTickCount() = 531

동시에 문서에 따라 줄을 바꿨습니다.

         FileFlush (handle_file);
         FileWrite (handle_file,t);
그러나 아직 FileWrite() 전에 FileFlush()를 호출하는 요점을 파악하지 못했습니다.
 
Yedelkin :

다음과 같이 했습니다.

결과:

2011.05.29 23:14:31 FlushSave (EURGBP,M1) FileFlush. GetTickCount() = 13563
2011.05.29 23:14:32 FlushSave (EURGBP,M1) 파일 닫기. GetTickCount() = 531

동시에 문서에 따라 줄을 바꿨습니다.

그러나 아직 FileWrite() 전에 FileFlush()를 호출하는 요점을 파악하지 못했습니다.

다음은 옵션입니다.

 int handle_file;
datetime t;
uint u;

void OnStart ()
{
//---пример с функцией FileFlush()
u= GetTickCount ();

handle_file= FileOpen ( "Ye_file.txt" , FILE_READ | FILE_WRITE | FILE_TXT );

   for ( int i= 0 ;i< 1000 ;i++)
  {
     if (handle_file!= INVALID_HANDLE )
    {
    t= TimeLocal ();
     FileSeek (handle_file, 0 , SEEK_END );
     FileFlush (handle_file);
     FileWrite (handle_file,t);
    }
  }

FileClose (handle_file);

Print ( "FileFlush. GetTickCount() = " , GetTickCount ()-u);

}

결과는 FileFlush입니다. GetTickCount() = 26125

다음은 옵션입니다.

 int handle_file;
datetime t;
uint u;

void OnStart ()
{
//---пример без функции FileFlush()
u= GetTickCount ();

   for ( int i= 0 ;i< 1000 ;i++)
  {
  handle_file= FileOpen ( "Ye_file2.txt" , FILE_READ | FILE_WRITE | FILE_TXT );
      
     if (handle_file!= INVALID_HANDLE )
    {
    t= TimeLocal ();
     FileSeek (handle_file, 0 , SEEK_END );
     FileWrite (handle_file,t);
     FileClose (handle_file);
    }

  }

Print ( "FileClose. GetTickCount() = " , GetTickCount ()-u);

}
결과는 파일 닫기입니다. GetTickCount() = 3969
 

이 옵션은 47에서 110 사이의 결과를 제공했습니다.

 int handle_file;
datetime t;
uint u;

void OnStart ()
{

u= GetTickCount ();

handle_file= FileOpen ( "Ye_file.txt" , FILE_READ | FILE_WRITE | FILE_TXT );

   for ( int i= 0 ;i< 1000 ;i++)
  {
     if (handle_file!= INVALID_HANDLE )
    {
    t= TimeLocal ();
     FileSeek (handle_file, 0 , SEEK_END );
     FileWrite (handle_file,t);
    }
  }

FileClose (handle_file);

Print ( "FileFlush. GetTickCount() = " , GetTickCount ()-u);

}

1. 결론 - 루프에서 FileFlush를 사용하면 실행 속도가 약 260배 느려집니다.

2. 이러한 변형의 50000개 레코드에 대한 주기의 결과는 FileFlush입니다. GetTickCount() = 1891

3. 50,000개 항목에 대한 루프를 실행할 때 파일 쓰기를 완료하지 않고 터미널을 종료할 수 없었습니다(터미널을 닫고 프로세스를 "종료"했습니다).

4. 100000개 레코드의 루프로 터미널을 종료할 수 있었지만 파일에는 65536개 이상의 레코드가 있었습니다(드레인은 Excel 2003에 배치됨).

 
Yedelkin :

동시에 문서에 따라 줄을 바꿨습니다.

이것은 문서의 어디에 기록되어 있습니까?

그러나 아직 FileWrite() 전에 FileFlush()를 호출하는 요점을 파악하지 못했습니다.

그것이 없는 것의 의미를 어떻게 이해할 수 있습니까? 라인의 순서를 고국으로 되돌리고 다시 확인하십시오. 분명히 문서가 정확하지 않습니다.

하지만... 테스트 덕분에 오류가 발견된 것 같습니다. FileFlush 는 변경 사항이 없는 상태에서 허용할 수 없을 정도로 오랜 시간을 소비합니다.

흥미로운 :

어머나! 결론은 일반적으로 광기입니다. 이것은 "OOP가 더 빠름" 또는 "지표가 느립니다. 모든 코드를 전문가 고문에게 전송해야 합니다"와 같은 응용 프로그램이 나중에 나타나는 방식입니다.

 
papaklass :

전문가, 이 기능을 올바르게 사용하는 방법을 작성하십시오.

다음과 같이 가정합니다.

 // open handle
for ( int i= 0 ;i< 1000 ;i++)
  {
     if (handle_file!= INVALID_HANDLE )
    {
    t= TimeLocal ();
     FileSeek (handle_file, 0 , SEEK_END );
     FileWrite (handle_file,t);
     FileFlush (handle_file);
    }
  }
// close handle

저것들. FileClose -- FileOpen 바인딩을 FileFlush 와 비교하는 것이 옳습니다.

이론적으로 FileFlush는 FileClose의 필수적인 부분이어야 하며 번들보다 느릴 수 없습니다.

변경 사항이 나타나기 전에 깜박이는 것은 의미가 없습니다. 그들은 아직 존재하지 않습니다 :)

그러나 거친 결론에도 불구하고 테스트는 여전히 지시적이므로 변경 사항이 없을 때 기능이 어떻게 작동하는지에 대한 개발자의 의견을 기다리고 있습니다.