小さなファイルを大きなファイルにマージしました。アプリを最初に起動すると、このファイルが読み取られ、ファイル システム (Isolated Storage) に小さなファイルが 1 つずつ作成されます。
このファイルに 44 個の小さなファイルが含まれており、最大 200kb の場合、アルゴリズムはデバイス上で 120 ミリ秒動作します。このファイルに 140 個のさらに小さなファイルが含まれ、最大 400kb の場合、アルゴリズムはデバイス上で 3000 ミリ秒動作します。
両方のファイルから 44 ファイルしか取得しない場合、最初のファイルは 120 ミリ秒まで、2 番目のファイルは 800 ミリ秒まで機能します。
これは私にとって不思議に思えます。ファイル内のデータの形式は単純です
-INT32 - ENTRIES COUNT
--STRING ENTRY NAME |
--INT32 ENTRY DATA LENGTH | REPEATS {ENTRY COUNT} TIMES
--BYTE[] ENTRY DATA |
私にとって、これは Windows Phone の IsolatedStorage メカニズムの魔法のように思えます。同じ数のエントリをコピーする場合、2 番目のファイルの動作が 7 ~ 8 倍遅くなる理由はまったくありません。
再現プロジェクト - https://www.dropbox.com/s/6bjsve7p8wew3kb/IsoStorageWonder.zip?m
コード:
public static void CopyCache(ILogger logger)
{
using (var isoStorage = IsolatedStorageFile.GetUserStoreForApplication())
{
var streamInfo = Application.GetResourceStream(new Uri(_dataFilePath, UriKind.RelativeOrAbsolute));
isoStorage.CreateDirectory("HttpCache");
var binaryReader = new BinaryReader(streamInfo.Stream);
{
int itemsCount = binaryReader.ReadInt32();
for (int i = 0; i < ENTRIES_COUNT; i++)
{
string fileName = binaryReader.ReadString();
int length = binaryReader.ReadInt32();
byte[] data = binaryReader.ReadBytes(length);
using (
var fileStream =
new IsolatedStorageFileStream(
Path.Combine(_rootCacheDir, fileName),
FileMode.Create,
FileAccess.Write,
FileShare.None,
isoStorage))
{
fileStream.Write(data, 0, data.Length);
}
}
}
}
}
マジック!