Dosyalarla çalışma. - sayfa 3

 
Yedelkin :
"Bir dosya kapatıldığında, veriler otomatik olarak diske aktarılır, bu nedenle FileClose() işlevini çağırmadan önce FileFlush() işlevini çağırmaya gerek yoktur" - Evet, Sergeev'in neden bahsettiğini anlamaya başlıyorum. Dosyadaki son kaydın korunmasını garanti etmek için FileClose() yerine FileFlush()? Ve bu akıllıca bir karar olur mu?

yerine değil, zorunluluktan.

Flush - geri kalan verileri temizler ve dosyayı KAPATMAZ . İstediğin bu mu?

Kapat - geri kalan verileri diske boşaltır ve kapatır.

 
sergeev :

yerine değil, zorunluluktan.

Flush - geri kalan verileri temizler ve dosyayı KAPATMAZ . İstediğin bu mu?

Kapat - geri kalan verileri diske boşaltır ve kapatır.

Evet, tam olarak bundan bahsediyoruz. Doğru çözümle ilgili ipucu için teşekkürler!
 
Yedelkin :

FileFlush () kullanarak zamanı en aza indiren bir şey pek iyi çalışmıyor:

2011.05.29 21:58:20 FlushSave (EURGBP,M1) FileFlush. GetTickCount() = 133766
2011.05.29 22:00:33 FlushSave (EURGBP,M1) Dosya Kapat. GetTickCount() = 133734
Aslında, her iki işlevin de çalışması aynı miktarda zaman alır.

Anladığım kadarıyla, bu satır konumu ofset olmadan dosyanın başına taşır. Bu, mevcut bilgilerin üzerine yazmanıza olanak tanır (yani tarih güncellenir ancak dosyada birikmez)

 FileSeek (handle_file, 0 , SEEK_SET );

Bu durumda SEEK_SET yerine dosyanın sonuna geçiş kullanırsanız, veriler dosyada birikir.

 
Yedelkin :

Her Flush yaptığınızda yeni bir dosya tanıtıcısı açarsınız. Ne için? Ve bu arada kapatmayın.

FileFlush işlevinin avantajı, tutamacı yeniden açmanıza gerek olmamasıdır.

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

1. Anladığım kadarıyla bu satır dosyadaki pozisyonu ofsetsiz olarak hareket ettiriyor. Mevcut bilgilerin üzerine yazmanıza izin veren şey (yani tarih güncellenir ancak dosyada birikmez)

Bu durumda SEEK_SET yerine dosyanın sonuna geçiş kullanırsanız, veriler dosyada birikir.
Mesajımı zaten sildim. Orada, örnekte, dosyaya yazdıktan sonra FileFlush() öğesini ekledim.
 
TheXpert :

Her Flush yaptığınızda yeni bir dosya tanıtıcısı açarsınız. Ne için? Ve bu arada kapatmayın.

FileFlush işlevinin avantajı, tutamacı yeniden açmanıza gerek olmamasıdır.

Böyle mi yaptı:

 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);
  }

Sonuç:

2011.05.29 23:14:31 FlushSave (EURGBP,M1) FileFlush. GetTickCount() = 13563
2011.05.29 23:14:32 FlushSave (EURGBP,M1) Dosya Kapat. GetTickCount() = 531

Aynı zamanda, belgelere göre satırları değiştirdim:

         FileFlush (handle_file);
         FileWrite (handle_file,t);
Ama FileFlush()'ı FileWrite()'dan önce çağırmanın amacını henüz çözemedim.
 
Yedelkin :

Böyle mi yaptı:

Sonuç:

2011.05.29 23:14:31 FlushSave (EURGBP,M1) FileFlush. GetTickCount() = 13563
2011.05.29 23:14:32 FlushSave (EURGBP,M1) Dosya Kapat. GetTickCount() = 531

Aynı zamanda, belgelere göre satırları değiştirdim:

Ama FileFlush()'ı FileWrite()'dan önce çağırmanın amacını henüz çözemedim.

İşte bir seçenek:

 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);

}

Sonuç FileFlush'tır. GetTickCount() = 26125

İşte bir seçenek:

 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);

}
Sonuç FileClose'dur. GetTickCount() = 3969
 

Bu seçenek 47'den 110'a kadar bir sonuç verdi.

 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. Sonuç - FileFlush'ı bir döngüde kullanmak , yürütmeyi yaklaşık 260 kat yavaşlatır.

2. Bu tür bir varyantta 50000 kayıt üzerindeki döngü aşağıdaki sonuca sahiptir - FileFlush. GetTickCount() = 1891

3. 50.000 giriş için bir döngü yürütürken, dosyaya yazmayı tamamlamadan terminali asla kapatmayı başaramadım (terminali kapattım ve süreci "öldürdüm").

4. 100.000 kayıtlık bir döngü ile, dosyada 65536'dan fazla kayıt varken terminali öldürmek mümkündü (boşaltma Excel 2003'te yerleştirilmiştir).

 
Yedelkin :

Aynı zamanda, belgelere göre satırları değiştirdim:

Bu belgelerde nerede yazıyor?

Ama FileFlush()'ı FileWrite()'dan önce çağırmanın amacını henüz çözemedim.

Ona sahip olmayan bir şeyin anlamını nasıl anlayabilirsiniz? Hatların sırasını anavatanlarına iade edin ve iki kez kontrol edin. Görünüşe göre belgeler pek doğru değil.

Ama... Testleriniz sayesinde, hata bulundu gibi görünüyor - FileFlush , değişiklik olmadığında kabul edilemez derecede uzun bir süre yiyor.

ilginç :

AMAN TANRIM! Sonucun genellikle delilik olduğu yer. Bu şekilde "OOP daha hızlı" veya "göstergeler yavaş, tüm kodu bir Expert Advisor'a aktarmanız gerekiyor" gibi uygulamalar daha sonra çıkıyor.

 
papaklass :

Uzman, bu fonksiyonun nasıl doğru kullanılacağını yazın.

Varsayımsal olarak şöyle:

 // 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

Onlar. FileClose -- FileOpen bağlamasını FileFlush ile karşılaştırmak doğrudur .

Teorik olarak, FileFlush, FileClose'un ayrılmaz bir parçası olmalıdır ve bir paketten daha yavaş olamaz.

Değişiklikleri görünmeden önce yanıp sönmenin bir anlamı yoktur. henüz yoklar :)

Ancak, çılgın sonuçlara rağmen, testler hala gösterge niteliğindedir, bu nedenle geliştiricilerin, herhangi bir değişiklik olmadığında işlevin nasıl çalıştığına dair yorumlarını bekliyoruz.