Сильно тормозит чтение-запись файла.

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сильно тормозит чтение-запись файла.

Сообщение Mikle » 13.02.2015 (Пт) 10:21

Ситуация - у меня есть видеозапись, wmv файл на dvd диске, размер чуть более 4 Гб. На диске у внешнего края есть глубокая царапина, это почти самый конец файла. Мне нужно скопировать этот файл, пусть с потерей информации.
Сначала я написал на vb6 такую программку
Код: Выделить всё
Option Explicit

Sub Main()
  Dim b(65535) As Byte
  Dim nf1 As Long, nf2 As Long, p As Long

  On Local Error Resume Next

  nf1 = FreeFile
  Open "f:\1.wmv" For Binary As #nf1 ' Это DVD
  nf2 = FreeFile
  Open "d:\1.wmv" For Binary As #nf2 ' Это HDD
  Do While Not EOF(nf1)
    DoEvents
    Get #nf1, , b()
    Put #nf2, , b()
  Loop
  Close
  MsgBox "Ready"
End Sub

Понятно, что должен получиться файл чуть больше нужного, я планировал потом урезать размер.
Но, что естественно, я упёрся в 2Гб предел. Вроде бы можно через API это обойти, и я даже что-то такое читал тут на сайте, но есть же современное средство - vb.net :)
Я написал такую программку:
Код: Выделить всё
Option Strict Off
Option Explicit On
Module Модуль1

  Public Sub Main()
    Dim nf2, nf1 As Integer
    Dim p As Long
    Dim b() As Byte

    On Error Resume Next

    nf1 = FreeFile()
    FileOpen(nf1, "f:\1.wmv", OpenMode.Binary, OpenAccess.Read)
    nf2 = FreeFile()
    FileOpen(nf2, "d:\1.wmv", OpenMode.Binary, OpenAccess.Write)
    ReDim b(&H1000000 - 1)
    p = 1
    Do
      System.Windows.Forms.Application.DoEvents()
      FileGet(nf1, b)
      FilePut(nf2, b)
      p = p + &H1000000
      If LOF(nf1) - p < &H1000000 Then
        ReDim b(LOF(nf1) - p - 1)
        FileGet(nf1, b)
        FilePut(nf2, b)
        Exit Do
      End If
    Loop
    FileClose()
    MsgBox("Ready")
  End Sub
End Module

Тут уже учтён точный размер файла, но почему оно так тормозит??? Программа на vb6 до 2Гб дошла за три минуты, эта добралась до 3.5Гб за час, а дальше мне пришлось её остановить потому, что нужно было уходить и выключать компьютер.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 13.02.2015 (Пт) 12:44

Mikle писал(а):но почему оно так тормозит???

Потому что не надо использовать всякие vb6-функции.
Да ещё и получение длины файла в цикле зачем-то.

Mikle писал(а):Мне нужно скопировать этот файл, пусть с потерей информации.

А почему бы для этого не воспользоваться готовым файловым менеджером?

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Сильно тормозит чтение-запись файла.

Сообщение Mikle » 13.02.2015 (Пт) 14:14

Qwertiy писал(а):Потому что не надо использовать всякие vb6-функции.

Что значит не надо? Зачем они там вообще есть, если ими нельзя пользоваться?
Получение длины файла вынесу из цикла, хотя сомневаюсь, что это что-то изменит.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 13.02.2015 (Пт) 15:10

Mikle писал(а):Что значит не надо? Зачем они там вообще есть, если ими нельзя пользоваться?

Их использовать можно, если плевать на производительность. В большинстве замеров, где стараются доказать, что VB.NET медленнее шарпа, эта медленность создаётся именно за счёт использования vb6-like-функций.
Этот великолепный набор костылей нужен, вероятно, для снижения порога перехода с VB6 и упрощения конвертирования кода.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Сильно тормозит чтение-запись файла.

Сообщение Mikle » 27.02.2015 (Пт) 14:03

Я просто перекомпилировал под фреймворк 2.0, и быстродействие стало нормальным, таким же, как у vb6.
По умолчанию стоял фреймворк 3.5.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 27.02.2015 (Пт) 17:28

А чего не под 4й?
И почему всё-таки нормально не сделать?

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Сильно тормозит чтение-запись файла.

Сообщение Mikle » 27.02.2015 (Пт) 18:30

Qwertiy писал(а):А чего не под 4й?

2008-я студия.
Qwertiy писал(а):И почему всё-таки нормально не сделать?

Да мне уже не нужно, я нашёл специализированную программу - и ей сделал. А это просто пришла мысль, провёл эксперимент.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 27.02.2015 (Пт) 18:43

Mikle писал(а):2008-я студия.

Можно и без студии скомпилировать - лишь бы фреймвёрк был.
У меня даже в подписи ссылка есть: Компиляция VB.NET с помощью bat-файла ;)

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Сильно тормозит чтение-запись файла.

Сообщение Mikle » 27.02.2015 (Пт) 19:34

Qwertiy писал(а):Можно и без студии скомпилировать - лишь бы фреймвёрк был.

VB тоже можно? Интересно, я до сих пор думал, что только шарп.
Qwertiy писал(а):У меня даже в подписи ссылка есть: Компиляция VB.NET с помощью bat-файла

Там написано "с помощью bat-файла", но не написано "без наличия студии", поэтому я и внимания не обращал.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 27.02.2015 (Пт) 19:41

Mikle писал(а):VB тоже можно? Интересно, я до сих пор думал, что только шарп.

Всё можно :) Кроме C++.NET, вроде.
Можно даже целый солюшн без студии билдить (при помощи msbuild), если фреймвёрк не клиентской версии. И если ты в файл солюшена какой-нибудь фокус не запихнул :mrgreen:


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: SemrushBot и гости: 11

    TopList