我从阅读MSDN文档中了解到,IDisposable
接口的"主要"用途是清理非托管资源.
对我来说,"非托管"意味着数据库连接,套接字,窗口句柄等等.但是,我已经看到了Dispose()
实现该方法以释放托管资源的代码,这对我来说似乎是多余的,因为垃圾收集器应该照顾那对你而言.
例如:
public class MyCollection : IDisposable
{
private List<String> _theList = new List<String>();
private Dictionary<String, Point> _theDict = new Dictionary<String, Point>();
// Die, clear it up! (free unmanaged resources)
public void Dispose()
{
_theList.clear();
_theDict.clear();
_theList = null;
_theDict = null;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,这是否使得垃圾收集器可以使用的内存MyCollection
比通常更快?
编辑:到目前为止,人们已经发布了一些使用IDisposable清理非托管资源(例如数据库连接和位图)的好例子.但是假设_theList
在上面的代码中包含了一百万个字符串,并且你想现在释放那个内存,而不是等待垃圾收集器.上面的代码会实现吗?
我想获取目录中的文件列表,但我想对其进行排序,使得最旧的文件是第一个.我的解决方案是调用File.listFiles,然后根据File.lastModified求助于列表,但我想知道是否有更好的方法.
编辑:我建议的当前解决方案是使用匿名比较器:
File[] files = directory.listFiles();
Arrays.sort(files, new Comparator<File>(){
public int compare(File f1, File f2)
{
return Long.valueOf(f1.lastModified()).compareTo(f2.lastModified());
} });
Run Code Online (Sandbox Code Playgroud) 假设我有以下C代码.
unsigned int u = 1234;
int i = -5678;
unsigned int result = u + i;
Run Code Online (Sandbox Code Playgroud)
什么隐式转换在这里怎么回事,这是代码为安全的所有值u
和i
?(安全,从某种意义上说,即使此示例中的结果会溢出到某个巨大的正数,我也可以将其转换回int并获得真实的结果.)
我们有一台运行SQL Server 2005的Windows机器,我们需要能够从Linux机器上运行一些数据库查询.有哪些建议的方法可以做到这一点?理想情况下,我们需要一个类似于Windows上的sqlcmd的命令行实用程序.
假设我正在用C++和C#编写应用程序.我想用C++编写低级部分并在C#中编写高级逻辑.如何从我的C++程序加载.NET程序集并开始调用方法并访问我的C#类的属性?
我在使用C API找出使用Python回溯的正确方法时遇到了一些麻烦.我正在编写一个嵌入Python解释器的应用程序.我希望能够执行任意Python代码,如果它引发异常,则将其转换为我自己的特定于应用程序的C++异常.目前,仅提取引发Python异常的文件名和行号就足够了.这是我到目前为止:
PyObject* pyresult = PyObject_CallObject(someCallablePythonObject, someArgs);
if (!pyresult)
{
PyObject* excType, *excValue, *excTraceback;
PyErr_Fetch(&excType, &excValue, &excTraceback);
PyErr_NormalizeException(&excType, &excValue, &excTraceback);
PyTracebackObject* traceback = (PyTracebackObject*)traceback;
// Advance to the last frame (python puts the most-recent call at the end)
while (traceback->tb_next != NULL)
traceback = traceback->tb_next;
// At this point I have access to the line number via traceback->tb_lineno,
// but where do I get the file name from?
// ...
}
Run Code Online (Sandbox Code Playgroud)
在Python源代码中,我看到它们通过_frame
结构访问当前帧的文件名和模块名,看起来它是一个私有定义的结构.我的下一个想法是以编程方式加载Python'traceback'模块并使用C API调用其函数.这样理智吗?有没有更好的方法从C访问Python回溯?
这是我的设置:
在我的settings.py文件中
BROKER_BACKEND = "djkombu.transport.DatabaseTransport"
Run Code Online (Sandbox Code Playgroud)
即我只是使用数据库来排队任务.
现在我的问题是:我有一个用户启动的任务,可能需要几分钟才能完成.我希望每个用户只运行一次任务,我会将任务的结果缓存在一个临时文件中,这样如果用户再次启动任务,我只需返回缓存的文件.我的视图函数中的代码如下所示:
task_id = "long-task-%d" % user_id
result = tasks.some_long_task.AsyncResult(task_id)
if result.state == celery.states.PENDING:
# The next line makes a duplicate task if the user rapidly refreshes the page
tasks.some_long_task.apply_async(task_id=task_id)
return HttpResponse("Task started...")
elif result.state == celery.states.STARTED:
return HttpResponse("Task is still running, please wait...")
elif result.state == celery.states.SUCCESS:
if cached_file_still_exists():
return get_cached_file()
else:
result.forget()
tasks.some_long_task.apply_async(task_id=task_id)
return HttpResponse("Task started...")
Run Code Online (Sandbox Code Playgroud)
这段代码几乎可行.但是当用户快速重新加载页面时,我遇到了问题.在任务排队和最终将任务从队列中拉出并提供给工作人员之间有1-3秒的延迟.在此期间,任务的状态仍为PENDING,这会导致视图逻辑启动重复任务.
我需要的是一些方法来判断任务是否已经提交到队列中,所以我最终不会提交两次.在芹菜中有这样做的标准方法吗?
我遇到了一些C代码,其中作者在整个地方使用以下习语:
typedef __int32 FOO_INT32;
#define FOO_INT32 FOO_INT32
Run Code Online (Sandbox Code Playgroud)
这样做有什么意义?typedef不应该足够吗?对于一些不稳定的C编译器来说,这是一种解决方法吗?
我有以下MySQL表(简化):
CREATE TABLE `track` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`title` varchar(256) NOT NULL,
`is_active` tinyint(1) NOT NULL,
PRIMARY KEY (`id`),
KEY `is_active` (`is_active`, `id`)
) ENGINE=MyISAM AUTO_INCREMENT=7495088 DEFAULT CHARSET=utf8
Run Code Online (Sandbox Code Playgroud)
'is_active'列标记了我想在大多数但不是全部查询中忽略的行.我有一些查询定期从这个表中读取块.其中一个看起来像这样:
SELECT id,title from track where (track.is_active=1 and track.id > 5580702) ORDER BY id ASC LIMIT 10;
Run Code Online (Sandbox Code Playgroud)
此查询需要一分钟才能执行.这是执行计划:
> EXPLAIN SELECT id,title from track where (track.is_active=1 and track.id > 5580702) ORDER BY id ASC LIMIT 10;
+----+-------------+-------+------+----------------+--------+---------+-------+---------+-------------+
| id | select_type | table | type | possible_keys | key | …
Run Code Online (Sandbox Code Playgroud) 在我的Java应用程序中,我需要使用SSL连接到同一主机,但每次都使用不同的证书.我需要使用不同证书的原因是远程站点使用证书中嵌入的用户ID属性来标识客户端.
这是一个在3个不同操作系统上运行的服务器应用程序,我需要能够在不重新启动进程的情况下切换证书.
另一位用户建议将多个证书导入同一个密钥库.但是,我不确定这对我有帮助,除非有办法告诉Java使用密钥库中的哪个证书.
编辑:我将问题缩小到requirements.txt文件中"distribute == 0.6.10"行的存在.删除该行可以解决问题,并且还没有遇到来自该行的任何错误.
我在这里按照教程:http://devcenter.heroku.com/articles/django
一切进展顺利,直到我进入名为"跑一个工人"的部分.我的requirements.txt文件中有以下内容:
Django==1.3
amqplib==1.0.1
anyjson==0.3.1
celery==2.3.3
distribute==0.6.10
django-celery==2.3.3
django-kombu==0.9.4
django-picklefield==0.1.9
gunicorn==0.12.2
kombu==1.4.1
psycopg2==2.4.2
pyparsing==1.5.6
python-dateutil==1.5
wsgiref==0.1.2
Run Code Online (Sandbox Code Playgroud)
我按照说明中的说明将适当的芹菜配置添加到我的Procfile和settings.py的末尾.部署应用程序时,我收到以下错误:
Relaunching...
Traceback (most recent call last):
File "<string>", line 1, in <module>
NameError: name 'install' is not defined
Complete output from command /tmp/build_2o84wdweodb97/bin/python2.7 -c "import setuptools;__file__='/tmp/build_2o84wdweodb97/build/distribute/setup.py';exec(compile(open(__file__).read().replace('\r\n', '\n'), __file__, 'exec'))" install --single-version-externally-managed --record /tmp/pip-LIti3K-record/install-record.txt --install-headers /tmp/build_2o84wdweodb97/include/site/python2.7:
Run Code Online (Sandbox Code Playgroud)
完整的部署日志可以在这里找到:http://pastie.org/2609107
有人以前见过这个或者知道如何解决这个问题吗?