我有一个巨大的csv文件.它的大小约为9 GB.我有16 gb的ram.我按照页面上的建议进行操作并在下面实现.
If you get the error that R cannot allocate a vector of length x, close out of R and add the following line to the ``Target'' field:
--max-vsize=500M
Run Code Online (Sandbox Code Playgroud)
我仍然收到下面的错误和警告.我应该如何将9 gb的文件读入我的R?我有R 64位3.3.1,我在rstudio 0.99.903中运行命令.我有Windows Server 2012 r2标准,64位操作系统.
> memory.limit()
[1] 16383
> answer=read.csv("C:/Users/a-vs/results_20160291.csv")
Error: cannot allocate vector of size 500.0 Mb
In addition: There were 12 warnings (use warnings() to see them)
> warnings()
Warning messages:
1: In scan(file = file, what = what, sep = sep, …Run Code Online (Sandbox Code Playgroud) 我想增加为 WSL 分配的 RAM。我已经在我的 root /users/.wslconfig 中创建了。看起来怎么样:
[wsl2]
memory=6GB
swap=0
localhostForwarding=true
Run Code Online (Sandbox Code Playgroud)
我这样做了wsl --shutdown,然后启动 WSL 来应用更改。但我不知道如何检查分配的 RAM 是否已更改。我该如何检查?
我是一般的编程新手所以请在回答我的问题时牢记这一点.
我有一个程序,它采用一个大型3D阵列(10亿个元素)并沿各个轴汇总元素,以生成数据每一侧投影的2D数组.这里的问题是它非常密集,因为程序不断地从ram获取信息,包括读写.
问题是,如果我多线程化程序或者我最终会遇到RAM访问瓶颈,我会获得任何性能提升吗?当我说多线程时,我只是指2或4个核心的多线程,而不是更多.
如果它有帮助,我目前的计算机配置是2.4ghz core2 quad,1033 fsb,4gb ram,667mhz.
提前致谢,
-Faken
编辑:
在我看来,这里的人们对我最初预期的这个问题更感兴趣.我将扩展问题并为感兴趣的人发布一些代码.
首先,有一点关于我的背景,以便你了解我的来源.我是一名机械工程研究生,有些人设法选择一个与机械工程无关的话题.大约5年前,我在介绍性的java(强制)课程中学习了1门课程,直到大约一个月前,我才认真地开始学习论文.我还采取了(再次强迫,仍然不知道为什么)电子和计算机工程课程,我们处理微控制器(8位),它们的内部工作,以及一些ASM编码.除此之外,我对编程几乎一无所知.
这是代码:
int dim = 1000;
int steps = 7 //ranges from 1 to 255
for (int stage = 1; stage < steps; stage++)
for (int j = 0; j < dim; j++)
for (int i = 0; i < dim; i++)
{
sum = 0;
for (int k = 0; k < dim; k++)
if (partMap[(((i * dim) + k) * dim) + j] >= stage)
sum++; …Run Code Online (Sandbox Code Playgroud) 如何检测当前的RAM配置?我需要向windows询问RAM当前是在单通道,双通道还是四通道运行.
我搜索了很多,并没有在这个或其他网站上发现任何类似的问题,这对我来说非常令人惊讶.
我正在使用C++,但这个问题确实适用于所有编程语言,因为它是关于什么是windows函数或powershell/ cmd命令将给我我需要的信息.
如果RAM不是问题(我在服务器上接近200GB),更快地逐行读取或将所有内容读入RAM并访问它?每行将是一个大约200-500个unicode字符的字符串.每个文件有近200万行.
逐行
import codecs
for i in codecs.open('unicodefile','r','utf8'):
print i
Run Code Online (Sandbox Code Playgroud)
读入RAM
import codecs
for i in codecs.open('unicodefile','r','utf8').readlines():
print i
Run Code Online (Sandbox Code Playgroud) 我正在开发一个C++应用程序,它将一些用户密钥保存在RAM中.这个密钥非常敏感,我必须尽量减少对它们进行任何攻击的风险.
我正在使用一个字符数组来存储这些键,我已经阅读了一些关于在CPU寄存器甚至CPU缓存中存储变量的内容(即使用C++ register关键字),但似乎没有一种保证的方法来强制应用程序存储一些它是RAM之外的变量(我的意思是在CPU寄存器或缓存中).
任何人都可以建议一个好的方法来做这个或建议任何其他解决方案将这些密钥安全地保存在RAM中(我正在寻找一个独立于操作系统的解决方案)?
在测试是否any()短路时(确实如此!)我在预分配测试变量时发现了以下有趣的行为:
test=zeros(1e7,1);
>> tic;any(test);toc
Elapsed time is 2.444690 seconds.
>> test(2)=1;
>> tic;any(test);toc
Elapsed time is 0.000034 seconds.
Run Code Online (Sandbox Code Playgroud)
但是,如果我这样做:
test=ones(1e7,1);
test(1:end)=0;
tic;any(test);toc
Elapsed time is 0.642413 seconds.
>> test(2)=1;
>> tic;any(test);toc
Elapsed time is 0.000021 seconds.
Run Code Online (Sandbox Code Playgroud)
事实证明,这是因为变量在完全填充信息之前并不真正在RAM上,因此第一次测试需要更长时间,因为它需要分配它.我检查这个的方法是查看Windows任务管理器中使用的内存.
虽然这可能有些意义(不要在需要之前进行初始化),但让我更加困惑的是下面的测试,其中变量填充在for循环中,并且在某些时候执行被停止.
test=zeros(1e7,1);
for ii=1:1e7
test(ii)=1;
if ii==1e7/2
pause
end
end
Run Code Online (Sandbox Code Playgroud)
在检查MATLAB使用的内存时,我可以看到当停止时,它只使用了50%的test所需内存(如果已满).这可以用不同的记忆百分比再现.
有趣的是,以下内容也没有分配整个矩阵.
test=zeros(1e7,1);
test(end)=1;
Run Code Online (Sandbox Code Playgroud)
我知道MATLAB不是动态分配和增加test循环的大小,因为这会使结束迭代非常慢(由于需要高memcopys),并且它也会在我提出的最后一次测试中分配整个数组.所以我的问题是:
到底是怎么回事?
有人建议这可能与虚拟内存和物理内存有关,并且与操作系统看待内存的方式有关.不知道如何链接到这里提出的第一个测试.任何进一步的解释都是理想的.
赢得10 x64,MATLAB 2017a
我试图通过测试来测量DDR3内存数据传输速率.根据CPU规格.最大理论带宽为51.2 GB/s.这应该是四个通道的组合带宽,意味着12.8 GB /通道.然而,这是一个理论上的限制,我很好奇如何进一步提高这篇文章的实际限制.在下面描述的测试场景中,我实现了~14 GB/s的数据传输速率,我认为在杀死CPU L1,L2和L3高速缓存的大部分吞吐量增强时可能是近似的.
更新2014年第20/3期: 这种杀死L1-L3缓存的假设是错误的.内存控制器的硬件预取将分析数据访问模式,并且由于它是顺序的,因此它将具有将数据预取到CPU高速缓存中的简单任务.
具体问题在底部,但主要是我感兴趣的a)对导致该结果的假设的验证,以及b)是否有更好的方法在.NET中测量内存带宽.
我在.NET上用C#构建了一个测试作为入门者.虽然.NET从内存分配的角度来看并不理想,但我认为这对于这个测试是可行的(如果你不同意,请告诉我,为什么).测试是分配一个int64数组并用整数填充它.该数组应该在内存中对齐数据.然后,我使用与机器上的核心一样多的线程循环此数组,并从数组中读取int64值并将其设置为测试类中的本地公共字段.由于结果字段是公共的,我应该避免编译器优化循环中的东西.此外,这可能是一个弱假设,我认为结果保留在寄存器中,直到它再次被写入才被写入存储器.在每次读取数组中的元素之间,我在数组中使用10,100和1000的变量Step偏移量,以便无法在同一缓存块(64字节)中获取许多引用.
从数组中读取Int64应该意味着读取8个字节,然后读取实际值8个字节.由于数据是从64字节高速缓存行的内存中提取的,因此每次在循环中从RAM中读取的每个64字节应该对应于读取数据不在任何CPU高速缓存中.
以下是我初始化数据数组的方法:
_longArray = new long[Config.NbrOfCores][];
for (int threadId = 0; threadId < Config.NbrOfCores; threadId++)
{
_longArray[threadId] = new long[Config.NmbrOfRequests];
for (int i = 0; i < Config.NmbrOfRequests; i++)
_longArray[threadId][i] = i;
}
Run Code Online (Sandbox Code Playgroud)
这是实际的测试:
GC.Collect();
timer.Start();
Parallel.For(0, Config.NbrOfCores, threadId =>
{
var intArrayPerThread = _longArray[threadId];
for (int redo = 0; redo < Config.NbrOfRedos; redo++)
for (long i = 0; i < Config.NmbrOfRequests; i += Config.Step) …Run Code Online (Sandbox Code Playgroud) 我在其他AndroidStudio图片上看到,右下方有一个RAM使用情况.我试图在底部设置这个状态列表.但是右键单击对我没有帮助.如何在AndroidStudio中打开RAM使用情况?
我正在尝试将Python程序的RAM使用限制为一半,以便在使用所有RAM时不会完全冻结,为此我使用以下代码无效,我的笔记本电脑仍在冻结:
import sys
import resource
def memory_limit():
rsrc = resource.RLIMIT_DATA
soft, hard = resource.getrlimit(rsrc)
soft /= 2
resource.setrlimit(rsrc, (soft, hard))
if __name__ == '__main__':
memory_limit() # Limitates maximun memory usage to half
try:
main()
except MemoryError:
sys.stderr.write('MAXIMUM MEMORY EXCEEDED')
sys.exit(-1)
Run Code Online (Sandbox Code Playgroud)
我正在使用我从main函数调用的其他函数.
我究竟做错了什么?
提前致谢.
PD:我已经搜索了这个并找到了我已经提供的代码,但它仍然没有工作......