我在C中有一个小型库,它使用HDF5在Windows下写入数据(v.1.8.14).那个lib然后由一个C#应用程序使用,该应用程序执行其他一些操作,然后需要编写大量数据.
我现在需要启动应用程序的两个实例,其想法是将每个实例保存到放置在两个不同硬盘上的两个不同文件.但是,我遇到了性能问题和数据丢失.通过检查磁盘的使用情况,似乎是串行写入数据(第一个HD忙,而第二个不忙,然后第二个变忙,第一个不忙等等),这就像有一个磁盘(和一个磁盘速度不够快,两倍于数据).
那么我该怎么做才能从两个不同的进程写入两个不同的文件呢?我需要使用Parallel HDF5吗?如果我以后想要在同一个进程中写入两个不同的文件,那么你要提出的解决方案也会有用吗?请提供相关资源的详细信息和链接
我有一个非常简单的功能,可以解复用从电路板获取的数据.所以数据来自帧,每帧由多个信号组成,作为1-dim阵列,我需要转换为锯齿状阵列,每个信号一个.基本上如下:

我在C#工作,但我在C中有一个核心功能,可以完成单个信号的工作:
void Functions::Demux(short*pMux, short* pDemux, int nSignals, int signalIndex, int nValuesPerSignal)
{
short* pMuxStart = pMux + signalIndex;
for (size_t i = 0; i < nValuesPerSignal; i++)
*pDemux++ = *(pMuxStart + i * nSignals);
}
Run Code Online (Sandbox Code Playgroud)
然后我通过C#/ CLI(使用pin_ptr<short>,所以没有副本)从C#和并行调用它:
Parallel.For(0, nSignals, (int i) =>
{
Core.Functions.Demux(muxed, demuxed[i], nSignals, i, nFramesPerSignal);
});
Run Code Online (Sandbox Code Playgroud)
多路复用数据来自16k信号(16位分辨率),每个信号具有20k样本/ s,其变为16k*20k*2 = 640MB/s的数据速率.当在具有2 Xeon E5-2620 v4的工作站上运行代码(总共16个核心@ 2.1GHz)时,解复用器需要大约115%(10个数据需要11.5秒).
我需要至少减少一半的时间.有没有人知道某种方式,也许是AVX技术,或者更好的一些高性能库?或者可能有使用GPU的方法?我宁愿不改进CPU硬件,因为这可能会花费更多.
编辑
请考虑nSignals并且nValuesPerSignal可以更改并且交错的数组必须在nSignals单独的数组中拆分,以便在C#中进一步处理.
编辑:进一步测试
与此同时,在Cody Gray的评论之后,我用单核测试了:
void _Functions::_Demux(short*pMux, short** pDemux, int nSignals, int nValuesPerSignal)
{
for …Run Code Online (Sandbox Code Playgroud) 我试图在while循环中使用TPL,我需要将一些值传递给任务然后更改为循环.例如,这里显示了一个增加索引的示例(必须在请求创建任务的行之后):
int index = 0;
Task[] tasks;
while(/*condition*/)
{
tasks[index] = Task.Factory.StartNew(() => DoJob(index));
index++;
}
Run Code Online (Sandbox Code Playgroud)
但当然它不起作用,因为索引值可以在任务开始之前递增.一个可能的解决方案可能是在递增索引之前传递一个等待的WaitHandle,并且必须在DoJob方法中发出信号,但在我看来这不是一个非常好的解决方案.还有其他想法吗?
我开始使用ConcellationTokenSource和CancellationToken在框架4.0中提供的协作线程取消模式,我发现它非常有用和简单.
我的目的是为我的应用程序提供类似的优雅和简单的解决方案,但暂停线程而不是取消它们.因为在这种情况下,请求将与监听pause命令不同,我认为像PauseTokenSource和PauseToken这样的东西会很好.所以我的第一个问题是,如果你建议合作暂停的这种模式,或者它是否更好的其他东西.
如果有这样的模式是个好主意,你对这个模式有什么建议或指导吗?目前我认为源应该能够通过ManualResetEvent暂停和取消暂停,并且令牌应该具有对源的引用.它遵循初稿,我希望你能给我一些改进建议.
public class PauseTokenSource
{
protected ManualResetEvent mre = new ManualResetEvent(true);
object syncRoot = new object();
public PauseToken PauseToken { get { return new PauseToken(this); } }
public bool IsPauseRequested { get { return !mre.WaitOne(0); } }
public void Pause()
{
mre.Reset();
}
public void UnPause()
{
mre.Set();
}
public void WaitUntillPaused()
{
mre.WaitOne();
}
}
public class PauseToken
{
private PauseTokenSource source;
public PauseToken(PauseTokenSource source)
{
this.source = source;
}
public bool IsPauseRequested
{
get { return …Run Code Online (Sandbox Code Playgroud) c# design-patterns pausing-execution cancellation cancellationtokensource
我最近安装了vs2012,我已经更新了我的ClickOnce应用程序.更确切地说,我第一次打开我的C++ project(依赖于我的主要c#项目)我没有更新它,一切正常.VS 2012仍然能够看到Visual C++ 2010的先决条件.后来我通过将Platform Toolset更改为"Visual Studio 2012 (v110)"under 来更新了我的项目Properties->Configuration Properties->General.
与此同时,我已经安装了其他版本software,现在我发现我无法为我的ClickOnce发布项目添加Visual C++先决条件.该Visual C++ 2010 Runtime Libraries (x64)前提标有黄色三角形,它是缺失的.理想情况下我想更新Visual C++ 2012 Runtime Libraries x64 (and x86),但即使这个先决条件也缺失了.
我想这是因为在文件夹C:\Program Files (x86)\Microsoft SDKs\Windows\v8.0A\Bootstrapper\Packages中相应的包(vcredist_x64)是空的.我也注意到,在控制面板中安装的程序列表中我已经Microsoft Visual C++ 2010 x64和x86安装,同时可再发行版本和运行时版本(我认为他们在那里与Visual Studio 2010以前安装的),而我错过了在Visual C++ 2012文件.因此,我认为Visual C++ 2012没有与Visual Studio 2012结合在一起,不是吗?我甚至尝试通过下载来安装Visual C++ 2012 Redistributable x64软件包,现在它们已经在我安装的程序中列出,只有Redistributable,而不是Runtime版本.
但是先决条件仍然缺失.我怎么解决这个问题?我甚至想过手动复制引导程序包为Visual C++ 2010位于... \v7.0A\Bootstrapper\Packages文件夹,并手动更改它的C++ 2012,但我不知道我应该写在product.xml下面<MsiProductCheck …
突然,我的Inno Setup编译器停止工作.自从我上次使用它以来,我刚刚安装了一份新的证书给同一家公司.
我已经以这种方式配置了签名工具(NAME是证书中Subject的字符串的开头):
mysigntool="C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Bin\signtool.exe" sign /v /a /s my /n NAME /t http://timestamp.verisign.com/scripts/timestamp.dll
Run Code Online (Sandbox Code Playgroud)
然后在Inno Setup .iss文件中我有:
SignTool=mysigntool
SignedUninstaller=yes
Run Code Online (Sandbox Code Playgroud)
如果我删除/ t和时间戳,则符号总是以退出代码0x1失败.请注意,如果我从命令提示符运行相同的命令,则签名工作正常.
我有以下C++/CLI类:
public ref class MyClass
{
public:
int val;
bool operator==(MyClass^ other)
{
return this->val == other->val;
}
bool Equals(MyClass^ other)
{
return this == other;
}
};
Run Code Online (Sandbox Code Playgroud)
当我尝试从C#验证两个实例MyClass是否相等时,我得到了错误的结果:
MyClass a = new MyClass();
MyClass b = new MyClass();
//equal1 is false since the operator is not called
bool equal1 = a == b;
//equal2 is true since the comparison operator is called from within C++\CLI
bool equal2 = a.Equals(b);
Run Code Online (Sandbox Code Playgroud)
我做错了什么?
在下面的示例应用程序中,我创建了一个新的AppDomain,我执行它并启用了卷影复制.从新的AppDomain我然后尝试删除(替换)原来的主exe.但是我收到"访问被拒绝错误".有趣的是,在启动程序后,从Windows资源管理器中可以重命名主exe(但不能删除它).
阴影复制可以用于运行时覆盖主exe吗?
static void Main(string[] args)
{
// enable comments if you wanna try to overwrite the original exe (with a
// copy of itself made in the default AppDomain) instead of deleting it
if (AppDomain.CurrentDomain.IsDefaultAppDomain())
{
Console.WriteLine("I'm the default domain");
System.Reflection.Assembly currentAssembly = System.Reflection.Assembly.GetExecutingAssembly();
string startupPath = currentAssembly.Location;
//if (!File.Exists(startupPath + ".copy"))
// File.Copy(startupPath, startupPath + ".copy");
AppDomainSetup setup = new AppDomainSetup();
setup.ApplicationName = Path.GetFileName(startupPath);
setup.ShadowCopyFiles = "true";
AppDomain domain = AppDomain.CreateDomain(setup.ApplicationName, AppDomain.CurrentDomain.Evidence, setup);
domain.SetData("APPPATH", …Run Code Online (Sandbox Code Playgroud) c# ×6
algorithm ×1
appdomain ×1
avx ×1
c++-cli ×1
cancellation ×1
clickonce ×1
code-signing ×1
hdf5 ×1
inno-setup ×1
performance ×1
shadow-copy ×1
signing ×1
storing-data ×1
task ×1