Как записать длинную строку в файле отображения памяти? - PullRequest
0 голосов
/ 24 января 2019

У меня есть список данных в списке объектов, как показано ниже:

price:10, volumne:100, timestamp:1253568545
price:8, volumne:15, timestamp:4564546584545
price:68, volumne:846, timestamp:3548432545

, поэтому теперь я хочу записать эти данные в файл с отображением в памяти так же, как я записал здесь.Как и каждый новый символ информации в новой строке.Так как это сделать?Я упомянул мой код ниже, поэтому, пожалуйста, помогите мне решить эту проблему.

using (MemoryMappedFile mmf = MemoryMappedFile.CreateFromFile(@"D:\data.txt", System.IO.FileMode.OpenOrCreate, "map1", 1000))
{
   using (MemoryMappedViewAccessor accessor = mmf.CreateViewAccessor())
   {
     foreach (var item in data.ticks)
     {
       byte[] data1 = Encoding.UTF8.GetBytes(item.t.ToString() + "," + item.p.ToString() + "," + item.s.ToString());
       accessor.WriteArray(0, data1, 0, data1.Length);
      }
    }
}```

In final I need a result like below so please help for solve it:
10,100,1253568545
8,15,4564546584545
68,846,3548432545


1 Ответ

0 голосов
/ 24 января 2019

Первый аргумент метода .WriteArray() - это относительная позиция в представлении, с которого он должен начать запись.Всякий раз, когда вы пишете что-то, вы должны увеличивать этот курсор в соответствии с записанными байтами.И если количество байтов для записи плюс текущая позиция превышает текущий размер окна, вам необходимо создать новый вид на нужную позицию.Вот пример:

var items = Enumerable.Range(1, 80).Select(i => new { Id = Guid.NewGuid(), Name = $"Item {i}" }).ToList();

using (var file = MemoryMappedFile.CreateFromFile(@"D:\data.txt", System.IO.FileMode.OpenOrCreate, "myMap", 4096))
{
    MemoryMappedViewAccessor accessor = null;
    // Small window size to enforce roll-over for testing.
    var windowSize = 100;
    var absolutePosition = 0;
    var relativePosition = 0;

    try
    {
        accessor = file.CreateViewAccessor(absolutePosition, windowSize, MemoryMappedFileAccess.ReadWrite);

        foreach (var item in items)
        {
            var value = $"{item.Id},{item.Name}{Environment.NewLine}";
            var bytes = Encoding.UTF8.GetBytes(value);

            if (bytes.Length + relativePosition > windowSize)
            {
                absolutePosition += relativePosition;
                relativePosition = 0;
                accessor.Dispose();
                accessor = file.CreateViewAccessor(absolutePosition, windowSize, MemoryMappedFileAccess.ReadWrite);
            }

            accessor.WriteArray(relativePosition, bytes, 0, bytes.Length);
            relativePosition += bytes.Length;
        }
    }
    finally
    {
        if (accessor != null)
            accessor.Dispose();
    }
}
...