我有以下问题.我需要存储大量的信息(〜32 GB)的量和能够尽可能快地操纵它.我想知道最好的方法是什么(编程语言+操作系统的组合+你认为重要的东西).
我正在使用的信息的结构是双精度浮点数(8字节)的4D数组(NxNxNxN).现在我的解决方案是将4D阵列切成2D阵列并将它们存储在我的计算机硬盘中的单独文件中.这真的很慢,数据操作难以忍受,所以这根本不是解决方案!
我正在考虑进入我国的超级计算设施并将所有信息存储在RAM中,但我不确定如何实现应用程序以利用它(我不是专业的程序员,所以任何书籍/ reference将帮助我很多).
我正在考虑的替代解决方案是购买具有大量RAM的专用服务器,但我不确定这是否能解决问题.所以现在我的无知并没有让我选择最好的方式继续前进.
如果你遇到这种情况,你会怎么做?我对任何想法持开放态度.
提前致谢!
编辑:很抱歉没有提供足够的信息,我会尝试更具体.
我正在存储一个离散的4D数学函数.我想要执行的操作包括数组的转置(改变b [i,j,k,l] = a [j,i,k,l]等),数组乘法等.
由于这是对拟议实验的模拟,因此操作仅应用一次.一旦获得结果,就不必对数据执行更多操作.
编辑(2):
我也希望将来能够存储更多信息,因此解决方案应该以某种方式可扩展.当前的32 GB目标是因为我想让N = 256点的数组,但如果我可以使用N = 512(这意味着512 GB来存储它)会更好.
基本上就是这样.我在Matlab中有一些代码,我想发布它,所以任何人都可以使用它.另外我想防止代码在我之后关闭.
问:我可以选择GPL进行许可吗?如果没有,我的选择是什么?(除了停止使用Matlab,我已经在考虑)
编辑
我只是编辑它,因为这对我的情况更准确.很抱歉给您带来不便.
问:建议使用GPL发布我的Matlab代码以使其在社区中发展吗?如果没有,你会选择什么?
我一直在网上搜索这个问题,尽管在C/C++中有许多关于读/写的类似问题,但我还没有找到关于这个特定任务的信息.
我希望能够读取多个文件(256×256文件)只sizeof(double)字节位于每个文件的某个位置.现在我的解决方案是,对于每个文件:
打开文件(读取,二进制模式):
fstream fTest("current_file", ios_base::out | ios_base::binary);
寻找我想读的位置:
fTest.seekg(position*sizeof(test_value), ios_base::beg);
读取字节:
fTest.read((char *) &(output[i][j]), sizeof(test_value));
并关闭文件:
fTest.close();
这需要350 ms在for{ for {} }具有256x256次迭代的结构内运行(每个文件一个).
问:您认为有更好的方法来实施此操作吗?你会怎么做?
我正在从Matlab迁移到C + GSL,我想知道什么是计算矩阵B的最有效方法:
B[i][j] = exp(A[i][j])
Run Code Online (Sandbox Code Playgroud)
其中i在[0,Ny]中,j在[0,Nx]中.
请注意,这与矩阵指数不同:
B = exp(A)
Run Code Online (Sandbox Code Playgroud)
这可以通过GSL(linalg.h)中的一些不稳定/不支持的代码来完成.
我刚刚找到了强力解决方案(几个'for'循环),但有没有更明智的方法呢?
编辑
所有结果都来自1024x1024 for(for)循环,其中在每次迭代double中分配两个值(复数).时间是超过100次执行的平均时间.
gsl_matrix_complex_setGSL提供的功能时224.60 ms (案例3).案例1的源代码:
for(i=0; i<Nx; i++)
{
for(j=0; j<Ny; j++)
{
/* Operations to obtain c_value (including exponentiation) */
matrix[2*(i*s_tda + j)] = GSL_REAL(c_value);
matrix[2*(i*s_tda + j)+1] = GSL_IMAG(c_value);
}
}
Run Code Online (Sandbox Code Playgroud)
案例2的源代码:
for(i=0; i<Nx; i++)
{
for(j=0; j<Ny; j++)
{
/* Operations to …Run Code Online (Sandbox Code Playgroud) 假设我有一个二进制文件,其格式如下:4*sizeof(double),4*sizeof(size_t),(Ny*Nx)*dizeof(double).
前4个双打和4个size_ts是关于文件的元信息.剩下的就是我想用gnuplot绘制的数据.
现在我必须将文件转换为另一个没有标题的文件使用命令绘制:
plot "convertedfile.data" binary format='%double' array=(Ny, Nx) u 1 w image
Run Code Online (Sandbox Code Playgroud)
问:有没有办法告诉gnuplot忽略N二进制文件的起始字节,然后将其余部分绘制成矩阵?
我有一个存储在多线程应用程序中的资源存储对象.为了(希望)确保线程安全我每次想要访问资源或插入新资源时都会锁定互斥锁.例如,要插入新资源:
void ResourceManager::insertResource(const std::string& id)
{
// create the object with such ID
Resource res = Resource(id);
// ... more code on res
// lock the mutex to insert the resource
std::lock_guard<std::mutex> guard(mResourcesMutex);
// insert the resource in a STL container
mResources.insert(ResourceContainer::value_type(id, res));
// ... more code that does not require the mutex lock
}
Run Code Online (Sandbox Code Playgroud)
我希望lock_guard最小化范围,以便尽快调用析构函数,其他线程可以访问资源.特别是,我想在mResources.insert(...)语句之后解锁互斥锁.
我想过使用一个天真的if语句来确定lock_guard的范围:
if(true)
{
std::lock_guard<std::mutex> guard(mResourceMutex);
mResources.insert(ResourceContainer::value_type(id, res);
}
Run Code Online (Sandbox Code Playgroud)
但我不知道它的工作原理.我发现很难检查这是否确定了lock_guard是否正确,或者另一方面,编译器是否认为我疯了并且优化代码取出if语句.
我的问题是:
c ×2
c++ ×2
performance ×2
arrays ×1
exponential ×1
gnuplot ×1
gpl ×1
hpc ×1
licensing ×1
matlab ×1
matrix ×1
memory ×1
optimization ×1
plot ×1
raii ×1
scope ×1
visual-c++ ×1