我需要一个非常了解Java的人和内存问题的建议.我有一个大文件(类似1.5GB),我需要在许多(例如100个小文件)较小的文件中剪切此文件.
我一般都知道怎么做(使用a BufferedReader),但我想知道你是否有关于内存的任何建议,或者提示如何更快地完成它.
我的文件包含文本,它不是二进制文件,每行大约有20个字符.
我定期用R调用来清理R中的内存rm(list=ls()).
之后我需要打电话给垃圾收集器gc()吗?
这两个功能有什么区别?是否gc()要求rm()某些变量?
在JavaScript中,我们有两种方法可以创建"类"并赋予它公共功能.
方法1:
function MyClass() {
var privateInstanceVariable = 'foo';
this.myFunc = function() { alert(privateInstanceVariable ); }
}
Run Code Online (Sandbox Code Playgroud)
方法2:
function MyClass() { }
MyClass.prototype.myFunc = function() {
alert("I can't use private instance variables. :(");
}
Run Code Online (Sandbox Code Playgroud)
我读了很多次,人们说使用方法2效率更高,因为所有实例共享相同的函数副本而不是每个实例都有自己的副本.通过原型定义函数有一个巨大的缺点 - 它使得无法拥有私有实例变量.
即使理论上,使用方法1给对象的每个实例赋予它自己的函数副本(因此使用更多的内存,更不用说分配所需的时间) - 实际上实际发生了什么?似乎优化Web浏览器可以很容易地识别这种非常常见的模式,并且实际上让对象的所有实例引用通过这些"构造函数"定义的相同函数副本.然后,如果稍后显式更改,它只能为实例提供自己的函数副本.
关于两者之间的性能差异的任何见解 - 或甚至更好的现实世界经验 - 都将非常有帮助.
问题: Micro Framework如何为结构数组分配内存?
BitBucket存储库,包含要复制的代码.
我正在使用固定大小的数组来排队,以便在处理来自USB键盘的击键时插入延迟.我用a struct代表键上下事件和延迟.
public struct QueuedEvent
{
public readonly EventType Type; // Byte
public readonly byte KeyPressed;
public readonly TinyTimeSpan Delay; // Int16
public readonly static QueuedEvent Empty = new QueuedEvent();
}
public enum EventType : byte
{
None = 0,
Delay = 1,
KeyDown = 2,
KeyUp = 3,
KeyPress = 4,
}
public class FixedSizeQueue
{
private readonly QueuedEvent[] _Array;
private int _Head = 0;
private int _Tail = 0;
public FixedSizeQueue(int …Run Code Online (Sandbox Code Playgroud) .net c# memory-management .net-micro-framework out-of-memory
我想比较使用不同分配器分配的STL字符串,例如std::string使用自定义STL分配器的普通字符串.不幸的是,似乎通常operator==()在这种情况下不起作用:
// Custom STL allocator to allocate char's for string class
typedef MyAllocator<char> MyCharAllocator;
// Define an instance of this allocator
MyCharAllocator myAlloc;
// An STL string with custom allocator
typedef std::basic_string
<
char,
std::char_traits<char>,
MyCharAllocator
>
CustomAllocString;
std::string s1("Hello");
CustomAllocString s2("Hello", myAlloc);
if (s1 == s2) // <--- ERROR: doesn't compile
...
Run Code Online (Sandbox Code Playgroud)
特别是,MSVC10(VS2010 SP1)发出以下错误消息:
错误C2678:二进制'==':找不到哪个运算符带有'std :: string'类型的左操作数(或者没有可接受的转换)
所以,这样的低级(不太可读)代码:
if (strcmp(s1.c_str(), s2.c_str()) == 0)
...
Run Code Online (Sandbox Code Playgroud)
应该使用.
(在例如存在std::vector不同分配的字符串的情况下,这也是特别烦人的,其中通常的简单v[i] …
在RedHat Linux 6.2上,我正在运行free -m,它显示几乎所有8GB使用的
total used free shared buffers cached
Mem: 7989 7734 254 0 28 7128
-/+ buffers/cache: 578 7411
Swap: 4150 0 4150
Run Code Online (Sandbox Code Playgroud)
但同时在top -M我看不到使用所有这些内存的任何进程:
top - 16:03:34 up 4:10, 2 users, load average: 0.08, 0.04, 0.01
Tasks: 169 total, 1 running, 163 sleeping, 5 stopped, 0 zombie
Cpu(s): 0.7%us, 0.3%sy, 0.0%ni, 98.6%id, 0.4%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 7989.539M total, 7721.570M used, 267.969M free, 28.633M buffers
Swap: 4150.992M total, 0.000k used, 4150.992M …Run Code Online (Sandbox Code Playgroud) 如果buf是已malloc()分配的字符缓冲区,是否free(buf)设置/重置errno?
假设我想将缓冲区写入文件,然后释放它,因为我不再需要它了.
假设代码的错误策略是在错误时返回-1.
这是一种在不泄漏内存的情况下写出缓冲区和错误检查的正确方法吗?
fputs(buf, somefile);
free(buf);
if (errno) return -1;
Run Code Online (Sandbox Code Playgroud)
或者我是否需要考虑免费设置errno,如...
fputs(buf, somefile);
if (errno){
free(buf);
return -1;
}
free(buf);
Run Code Online (Sandbox Code Playgroud)
或者,恐怖的恐怖,
do {
fputs(buf, somefile);
int save_errno = errno;
free(buf);
errno = save_errno;
if (errno) return -1;
} while(0);
Run Code Online (Sandbox Code Playgroud)
如果需要重用块,则使用块允许本地save_errno存在于各个地方.
所有这些似乎都取决于free()是否设置了errno.
free()的linux手册页也是等的手册页malloc().它提到malloc()设置errno,但不是free().
用于释放动态内存的GNU C Library手册页没有提到free()是否设置了errno.
所以我写了一个简短的程序来强制写入错误,这样我就可以看到free()是否重置错误,而不是.我想知道我是否应该依赖这个结果以及free()是如此重要以至于"当然它没有设置errno"这一事实.
# See if free() resets errno on a bad write
#include <errno.h>
#include …Run Code Online (Sandbox Code Playgroud) 首先,至少有4-5个主题在SO上有类似的主题.我读了他们每个人,我觉得他们真的没有帮我解决这个具体问题.如果其他人发现重复的问题,我道歉.在我发布之前,我已经完成了我的搜索工作,因为它似乎是一个非常常见的问题.
我在Windows 7上使用Visual Studio .NET 2003.
我有自己的new/delete重载,指向我自己的malloc()和free()的自定义调用.我的新/删除重载在一个头文件中,我已经包含在几个文件中.
问题是,代码库几乎是意大利面,没有简单的方法可以确保所有东西都能使用这些重载.包括第三方库是黑盒子.我们到处都使用STL.
在我的测试中,我发现STL仍在混合调用我自己的新/删除和标准的MSVC新/删除调用.
将我的头文件包含在数千个其他文件中似乎不太现实,这需要花费太长时间.任何人都可以提供一些关于如何正确有效地重载新/全局删除所以一切都使用我的自定义内存管理器的技巧?
我最近阅读了关于管理你的应用程序内存的这篇文章,我强烈建议你阅读它,如果你是一个AndroidDev,从来没有.
有许多好的做法,我从未碰巧知道的一件事是系统在每个Activity/Fragment上调用的onTrimMemory(int level)方法,以通知应该或可以释放哪些内存的事件.
以下是该文章的引用:
请注意,只有当应用程序进程的所有UI组件对用户隐藏时,您的应用才会收到带有TRIM_MEMORY_UI_HIDDEN的onTrimMemory()回调.这与onStop()回调不同,后者在Activity实例变为隐藏时调用,即使用户移动到应用中的其他活动也会发生.因此,虽然您应该实现onStop()来释放活动资源(如网络连接)或取消注册广播接收器,但在收到onTrimMemory(TRIM_MEMORY_UI_HIDDEN)之前,通常不应释放UI资源.这可确保如果用户从您应用中的其他活动导航回来,您的UI资源仍可用于快速恢复活动.
我真的很想在我的应用程序中实现良好的内存管理,所以我期待以正确的方式实现onTrimMemory().
我只有几个问题:
什么"释放您的UI资源"意味着在这种情况下?只是为了清理Bitmap缓存,或者实际删除并销毁View树中的每个View?我通常会破坏onDestroy()或onDestroyView()方法中的视图,我现在想知道我是否正确行事.
是否存在onTrimMemory(TRIM_MEMORY_UI_HIDDEN)的Twin/Correspondent回调?例如onCreate-onDestroy,onStart-onStop,onCreateView-onDestroyView.我要求了解在调用onTrimMemory(TRIM_MEMORY_UI_HIDDEN)之后将活动/片段放入前台后我应该在何处以及如何恢复UI状态.
android memory-management android-fragments android-activity
就各自的语言标准而言,C仅通过malloc()族提供动态内存分配,而在C++中,最常见的分配形式是由::operator new().C风格的malloc也有C++版本,许多"baby的第一个分配器"示例使用它作为其核心分配函数,但我很好奇当代编译器如何实现实际的生产操作符 - new.
它只是一个薄的包装器malloc(),或者由于与典型的C程序相比,典型的C++程序的内存分配行为有很大不同,它是否会根本不同地实现?
[ 编辑:我认为主要区别通常描述如下:AC程序具有更少,更大,更长寿的分配,而C++程序具有许多小的短期分配.如果错误的话,请随意加入,但听起来有人会考虑到这一点.
对于像GCC这样的编译器,只需要一个单独的核心分配实现并将其用于所有相关语言就很容易,因此我想知道在每种语言中尝试优化分配性能的细节是否存在差异.
更新:感谢所有的好答案!看起来在GCC中这完全由ptmalloc解决,而且MSVC也在malloc核心使用.有谁知道MSVC-malloc是如何实现的?