我的应用程序是多线程的,具有密集的字符串处理.我们正在经历过多的内存消耗,并且分析已经证明这是由于String数据.我认为使用某种flyweight模式实现甚至缓存可以大大节省内存消耗(我知道Strings经常是重复的,尽管我在这方面没有任何硬数据).
我查看了Java Constant Pool和String.intern,但它似乎可能引发一些PermGen问题.
在java中实现应用程序范围的多线程字符串池的最佳替代方法是什么?
编辑:另见我以前的相关问题:java如何实现引擎盖下的字符串的flyweight模式?
这是关于Java字符串常量池.在我的一个程序中,我正在解密数据库的密码并将其存储在字符串中.我听说Java Strings将存储在一个常量池中,它们不会被VM重新启动或加载String Quits的ClassLoader破坏.
如果是这种情况,我的密码将存储在字符串池中.我非常关心这个问题.有没有其他方法来摧毁这些文字或我能做的任何其他事情.
请在此建议,
此致,Sunny.
我在C中寻找一个好的内存池实现.
它应包括以下内容:
Java有字符串池,因为字符串类的对象是不可变的.
但我的问题是 -
制作String POOL需要什么?
为什么字符串类没有像其他类一样保存自己的值?
内部JVM是否需要一些字符串,或者这是性能优势.如果有,怎么样?
到目前为止,每当我需要使用时,multiprocessing
我都是通过手动创建"进程池"并与所有子进程共享工作队列来完成的.
例如:
from multiprocessing import Process, Queue
class MyClass:
def __init__(self, num_processes):
self._log = logging.getLogger()
self.process_list = []
self.work_queue = Queue()
for i in range(num_processes):
p_name = 'CPU_%02d' % (i+1)
self._log.info('Initializing process %s', p_name)
p = Process(target = do_stuff,
args = (self.work_queue, 'arg1'),
name = p_name)
Run Code Online (Sandbox Code Playgroud)
这样我就可以在队列中添加东西,这些东西将由子进程使用.然后,我可以通过检查以下内容来监控处理的进度Queue.qsize()
:
while True:
qsize = self.work_queue.qsize()
if qsize == 0:
self._log.info('Processing finished')
break
else:
self._log.info('%d simulations still need to be calculated', qsize)
Run Code Online (Sandbox Code Playgroud)
现在我认为这multiprocessing.Pool
可以简化很多代码.
我无法找到的是如何监控仍有待完成的"工作量".
请看以下示例:
from multiprocessing import …
Run Code Online (Sandbox Code Playgroud) 我想在for循环中填充2D-numpy数组,并使用多处理来固定计算.
import numpy
from multiprocessing import Pool
array_2D = numpy.zeros((20,10))
pool = Pool(processes = 4)
def fill_array(start_val):
return range(start_val,start_val+10)
list_start_vals = range(40,60)
for line in xrange(20):
array_2D[line,:] = pool.map(fill_array,list_start_vals)
pool.close()
print array_2D
Run Code Online (Sandbox Code Playgroud)
执行它的效果是Python运行4个子进程并占用4个CPU核心,但执行没有完成,并且不打印数组.如果我尝试将数组写入磁盘,则没有任何反应.
谁能告诉我为什么?
我正在寻找几个开源工作流程调度程序,用于具有异构RAM使用的DAG作业.调度程序不仅应该调度少于最大线程数,还应该将所有并发任务的RAM总量保持在可用内存之下.
在这个Luigi Q&A中,有人解释说
您可以设置配置中可用资源的数量,然后设置任务消耗的资源数量作为任务的属性.这将限制您一次运行
n
该任务.在配置中:
Run Code Online (Sandbox Code Playgroud)[resources] api=1
在任务代码中:
Run Code Online (Sandbox Code Playgroud)resources = {"api": 1}
对于Airflow,我无法在其文档中找到相同的功能.最好的方法是在资源池中指定多个可用插槽,并指定任务实例使用资源池中的单个插槽.但是,似乎无法指定任务实例在池中使用多个插槽.
问题:专门针对Airflow,如何指定任务实例的定量资源使用?
我需要从Java应用程序管理与外部服务器的长时间运行的TCP套接字连接.我正在寻找一个好的套接字池,所以我将能够重新使用套接字.有什么建议吗?
我正在寻找一个负载均衡的线程池到目前为止没有成功.(不确定负载平衡是否是正确的措辞).让我解释一下我试图实现的目标.
第1部分:我有乔布斯,有8到10个单一任务.在6核CPU上,让8个线程并行处理这个任务,这似乎可以提供最佳的性能.当一个任务准备就绪时,另一个任务就可以开始.完成所有十项任务后,完成整个工作.通常,工作在30到60秒内完成.
第二部分:有时,不幸的是,这项工作需要两个多小时.由于必须计算的数据量,这是正确的.坏的是,在job1运行时没有其他工作可以启动(假设所有线程具有相同的持续时间),因为它正在使用所有线程.
我的第一个想法:拥有12个线程,并行允许最多三个作业.但是:这意味着,当只有一份工作时,这项工作就没有完全实现.
我正在寻找一种解决方案,在没有其他工作的情况下为作业1提供全部CPU能力.但是当另一个工作需要在另一个工作时启动时,我希望将CPU功率分配给这两个工作.当第三或第四个工作出现时,我希望cpu电源公平地分配给所有四个工作.
我赞成你的答案......
提前致谢
所以我试图通过做一点多处理来加快我的计算时间
我正在尝试使用池工人.
在我的代码的顶部,我有
import Singal as s
import multiprocessing as mp
def wrapper(Channel):
Noise_Frequincies = []
for i in range(1,125):
Noise_Frequincies.append(60.0*float(i))
Noise_Frequincies.append(180.0)
filter1 = s.Noise_Reduction(Sample_Rate,Noise_Frequincies,Channel)
return filter1
Run Code Online (Sandbox Code Playgroud)
然后到时候我用
Both_Channels = [Chan1, Chan2]
results = mp.Pool(2).map(wrapper,Both_Channels)
filter1 = results[0]
filter2 = results[1]
Run Code Online (Sandbox Code Playgroud)
我收到以下错误
Exception in thread Thread-2:
Traceback (most recent call last):
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/threading.py", line 808, in __bootstrap_inner
self.run()
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/threading.py", line 761, in run
self.__target(*self.__args, **self.__kwargs)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/pool.py", line 342, in _handle_tasks
put(task)
PicklingError: Can't pickle <type 'function'>: attribute lookup …
Run Code Online (Sandbox Code Playgroud)