Я обнаружил, что "загрузка" файла в память может занимать очень много времени - даже если моя машина, кажется, больше ничего не делает. Я приложил некоторый код, чтобы проиллюстрировать проблему:
Выход ниже.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Runtime.InteropServices;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
LoadFileUnman();
LoadFileUnman();
LoadFileUnman();
LoadFileUnman();
LoadFileUnman();
Console.WriteLine("Done");
}
public unsafe bool LoadFileUnman()
{
string filename = @"C:\DataFile.BNF";
var fileStream = new FileStream(filename,
FileMode.Open,
FileAccess.Read,
FileShare.Read,
16 * 1024,
FileOptions.SequentialScan);
if (fileStream == null)
{
Console.WriteLine( "Could not open file");
return true;
}
Int64 length = fileStream.Length;
Console.WriteLine("File length: " + length.ToString("#,###"));
UnmanagedMemoryStream GlobalMS;
IntPtr GlobalBuffer;
try
{
IntPtr myp = new IntPtr(length);
GlobalBuffer = Marshal.AllocHGlobal(myp);
}
catch (Exception er)
{
Console.WriteLine("Could not allocate memory: " + er.Message);
return true;
}
unsafe
{
byte* pBytes = (byte*)GlobalBuffer.ToPointer();
GlobalMS = new UnmanagedMemoryStream(pBytes, (long)length, (long)length, FileAccess.ReadWrite);
DateTime befDT = DateTime.Now;
fileStream.CopyTo(GlobalMS);
Console.WriteLine("Load took: " + DateTime.Now.Subtract(befDT).TotalMilliseconds.ToString("#,###") + "ms");
GlobalMS.Seek(0, SeekOrigin.Begin);
}
GlobalMS.Close();
fileStream.Close();
return false;
}
}
}
Вот вывод, сроки отличаются еще больше, когда я использую большие файлы (10G). Иногда для загрузки требуется несколько секунд или даже минута.
File length: 178,782,404
Load took: 5,125ms
File length: 178,782,404
Load took: 156ms
File length: 178,782,404
Load took: 172ms
File length: 178,782,404
Load took: 141ms
File length: 178,782,404
Load took: 1,891ms
Может кто-нибудь сказать мне, почему это так переменно, и если есть что-то, что я мог бы сделать.
EDIT 1
Из комментариев, которые у меня были - мне кажется хорошей идеей подчеркнуть, что мне нужен способ исправить изменчивость нагрузки, а не общую скорость. Я могу увеличить скорость, оптимизируя различные способы (и у меня есть), но проблема заключается в разнице времени последовательной загрузки.
EDIT 2
Вот службы, которые я использую. Я был бы признателен, если бы кто-нибудь заметил что-то, что может вызвать у меня проблемы.