- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
对于如何在 Azure 缓存中存储大于 8MB 的对象,有人有任何建议吗?就我而言,我使用 byte[] 将文件存储在 blob 中。但是,如果我能以某种方式将 byte[] 分割成更小的 block 并将其存储为部分文件,然后在从缓存中检索文件后执行合并。
伪代码:
存储
bs <- split file into byte[] that are smaller than 8MB
s <- string[bs.Length]
foreach bs with index i
s[i] <- name of bs[i]
Add bs[i] to Azure cache using s[i] as key
Add s to cache
检索:
s <- Get list of byte[] names
bs <- byte[s.Length]
foreach s with index i
bs[i] <- Get byte[] using s[i]
outBs <- Join bs to one byte[]
这里是否存在任何性能问题?
还有其他方法可以超越 Azure 缓存吗?
最佳答案
经过几个小时的工作,我发现可以将大文件拆分为较小的文件并将其存储到 Azure 缓存中。我想与您分享代码。
用于分割和连接字节[]的类
public class CacheHelper
{
private const int kMaxFileSize = 8000000;
private readonly int fFileSize;
private readonly string fFileName;
public CacheHelper(int sizeOfFile, string nameOfFile)
{
fFileSize = sizeOfFile;
fFileName = nameOfFile;
}
public CachingObjectHolder Split(byte[] file)
{
var remainingSize = file.Length;
var partialList = new List<byte[]>();
var partial = new byte[file.Length > kMaxFileSize ? kMaxFileSize : file.Length];
for (int i = 0; i < file.Length; i++)
{
if (i % kMaxFileSize == 0 && i > 0)
{
partialList.Add(partial);
partial = new byte[remainingSize > kMaxFileSize ? kMaxFileSize : remainingSize];
}
partial[i % kMaxFileSize] = file[i];
remainingSize--;
}
partialList.Add(partial);
return new CachingObjectHolder(fFileName, partialList);
}
public static byte[] Join(CachingObjectHolder cachingObjectHolder)
{
var totalByteSize = cachingObjectHolder.Partials.Sum(x => x.Length);
var output = new byte[totalByteSize];
var globalCounter = 0;
for (int i = 0; i < cachingObjectHolder.Partials.Count; i++)
{
for (int j = 0; j < cachingObjectHolder.Partials[i].Length; j++)
{
output[globalCounter] = cachingObjectHolder.Partials[i][j];
globalCounter++;
}
}
return output;
}
public static byte[] CreateFile(int size)
{
var tempFile = Path.GetTempFileName();
using (var stream = new FileStream(tempFile, FileMode.OpenOrCreate))
{
using (var memStream = new MemoryStream())
{
stream.SetLength(size);
stream.CopyTo(memStream);
return memStream.ToArray();
}
}
}
}
这是与Azure缓存通信的代码
public class Cache
{
private const string kFileListName = "FileList";
public static DataCacheFactory DataCacheFactory
{
get
{
return new DataCacheFactory();
}
}
private static DataCache fDataCache;
public static DataCache DataCache
{
get
{
if(fDataCache == null)
{
fDataCache = DataCacheFactory.GetDefaultCache();
}
return fDataCache;
}
}
public static byte[] Get(string name)
{
var dic = GetFileList();
if (dic == null)
{
return (byte[])DataCache.Get(name);
}
if (dic.ContainsKey(name))
{
var list = dic[name];
var input = new List<byte[]>();
var cache = DataCache;
list = list.OrderBy(x => x.Item2).ToList();
for (int i = 0; i < list.Count; i++)
{
input.Add(cache.Get(list[i].Item1) as byte[]);
}
var holder = new CachingObjectHolder(name, input);
return CacheHelper.Join(holder);
}
else
{
return (byte[])DataCache.Get(name);
}
}
public static void Put(string name, byte[] file)
{
if (file.Length > CacheHelper.kMaxFileSize)
{
var helper = new CacheHelper(file.Length, name);
var output = helper.Split(file);
var dic = GetFileList();
if (dic == null)
{
dic = new Dictionary<string, List<Tuple<string, int>>>();
}
var partials = new List<Tuple<string, int>>();
for (int i = 0; i < output.CachingObjects.Count; i++)
{
DataCache.Add(output.CachingObjects[i].Name, output.Partials[output.CachingObjects[i].Index]);
partials.Add(new Tuple<string, int>(output.CachingObjects[i].Name,
output.CachingObjects[i].Index));
}
dic.Add(name, partials.OrderBy(x => x.Item2).ToList());
PutFileList(dic);
}
else
{
DataCache.Add(name, file);
}
}
public static void Remove(string name)
{
var dic = GetFileList();
if (dic == null)
{
DataCache.Remove(name);
return;
}
if (dic.ContainsKey(name))
{
var list = dic[name];
for (int i = 0; i < list.Count; i++)
{
DataCache.Remove(list[i].Item1);
}
dic.Remove(name);
PutFileList(dic);
}
else
{
DataCache.Remove(name);
}
}
private static void PutFileList(Dictionary<string, List<Tuple<string, int>>> input)
{
DataCache.Put(kFileListName, input);
}
private static Dictionary<string, List<Tuple<string, int>>> GetFileList()
{
return DataCache.Get(kFileListName) as Dictionary<string, List<Tuple<string, int>>>;
}
}
Aaa和两个用于数据持有者的类
public class CachingObjectHolder
{
public readonly List<byte[]> Partials;
public readonly List<CachingObject> CachingObjects;
public readonly string CacheName;
public CachingObjectHolder(string name, List<byte[]> partialList)
{
Partials = partialList;
CacheName = name;
CachingObjects = new List<CachingObject>();
CreateCachingObjects();
}
private void CreateCachingObjects()
{
for (int i = 0; i < Partials.Count; i++)
{
CachingObjects.Add(new CachingObject(string.Format("{0}_{1}", CacheName, i), i));
}
}
}
public class CachingObject
{
public int Index { get; set; }
public string Name { get; set; }
public CachingObject(string name, int index)
{
Index = index;
Name = name;
}
}
以下是在云上测试该解决方案的结果。读/写时间以毫秒为单位。
关于c# - 在 Azure 缓存中存储大于 8MB 的对象的技术,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15895685/
我有一个本地存储库,有一个大文件被意外添加到其中。现在,即时通讯几乎落后了100次提交。当我尝试推送到GitHub时,它给了我一个错误。 我需要做任何我需要做的事情,以便能够推送此存储库的其余部分。
我正在尝试分配内存NSImage*originalLocationImage; NSURL *fileURL = [NSURL fileURLWithPath:originalLocation];//
我如何以及在何处可以编辑CDH4.7中的输入拆分大小,默认情况下为64 MB,但我想将其称为1MB,因为我的MR作业运行缓慢并且我想提高MR作业的速度。我想需要编辑cor-site属性IO.file.
我创建了一个 DLL,其中包含一个从 C# 代码调用的 JNI 函数。作为长时间运行的 GUI 应用程序的 C# 应用程序多次调用该函数。 我的 JNI 函数调用 JNI_GetCreatedJava
运行 TestDFSIO 后,我得到了以下指标: 2019-04-30 09:50:35,790 INFO fs.TestDFSIO: Date & time: Tue Apr
我正在测试连接到 Xcode 5.1.1 的运行 iOS 7.1 的 iPhone 4。我不明白为什么当仪器显示我的应用程序仅使用几兆字节并且有大量可用内存时我会收到内存警告甚至崩溃(见附件)。有什么
我有一个假设的值数据库,每个值的大小为 4 个字节(即 4,000,000,000)。所有值都存在于数据库中,因此它以 0 开头,以最大的 4 字节数字结尾。 只有一次,我想通过将 1 到 10000
我有一个字符串元组的 python 列表,格式如下:lst = [('xxx', 'yyy'), ...etc]。该列表包含大约 8154741 个元组。我使用了一个分析器,它说该列表占用大约 500
我需要每秒发送 1,00,000 批记录。我在实验后得到的是 azure event hub 的事件限制为 10,00,000 个字节。我的每条记录有 145 字节,我必须发送的总记录是 1,00,0
HDFS块大小默认为128 MB(来源:https://hadoop.apache.org/docs/r2.9.0/hadoop-project-dist/hadoop-hdfs/hdfs-defau
我需要每秒发送 1,00,000 批记录。我在实验后得到的是 azure event hub 的事件限制为 10,00,000 个字节。我的每条记录有 145 字节,我必须发送的总记录是 1,00,0
我正在 Linux 机器上运行 Jboss EAP 服务器 6.1。分配的堆内存如下。 JAVA_OPTS="-Xms2048m -Xmx2048m -XX:MaxPermSize=256m -Dja
我最近提出并解决了一个关于将大于 2 MB 的 .PDF 文件作为 BLOBS 上传到 MySQL 数据库的问题。我不得不更改我的 php.ini 文件中的一些设置和 MySQL 的最大数据包设置。然
我需要创建一个文本文件(字母数字),其大小(精确或接近)以 MB 为单位等于我输入的数字,例如 1 MB。我试图生成一个字符串,认为一个字符是 16 位或 2 字节,所以:1KB = 1024 字节
我已经阅读了很多有关通过设置 yarn.scheduler.maximum-allocation-mb 来解决此类问题的内容,我已将其设置为 2gb,因为我当前正在运行 select count(*)
这个问题在这里已经有了答案: this exceeds GitHub's file size limit [duplicate] (3 个回答) 1年前关闭。 核心程序崩溃数据。 我不知道核心文件是从
我已经建立了一个 Electron 应用程序,并使用 Electron 打包程序对其进行了打包。我制作了238MB的Windows bundle 包,而Linux版本是450 MB。我将其与也是 El
这个问题在这里已经有了答案: Generate an integer that is not among four billion given ones (38 个答案) 关闭 9 年前。 Give
我的 Meteor 应用程序获取一个 CSV 文件,使用 Baby Parse(Papa Parse for server)对其进行解析,并将数据插入到 MongoDB 集合中。 每个 CSV 行都作
Amazon SES 有 10 MB 的文件限制 我的问题是 有没有其他方法可以发送超过 10 MB 的文件? 最佳答案 这是一个硬限制。 您需要做的是包含您当前包含在电子邮件中的 Assets 的
我是一名优秀的程序员,十分优秀!