问题标签 [heavy-computation]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
javascript - 繁重的 JavaScript 计算块
我做(在 JavaScript/jQuery 中)繁重的计算。问题是这些计算阻塞了 UI 线程,我(尝试过)找不到避免这种情况的方法。
一些要求:
- 我无法使用 webWorkers
- 计算必须在客户端(我不能在服务器端进行 AJAX 调用)
我是一名 Android 程序员,所以我知道如何在 Java 中做到这一点(启动线程、进行计算、将数据发送到 UI 线程),所以我在这里尝试做同样的事情。
因此,这些繁重的计算只能有一个活动实例(我将制作一个 GIF 以告知用户他不能在此之前再次启动它),因此不需要管理多个调用(最后结束,开始新的)。
这是代码:
我正在对数据进行排序(为了避免从服务器重新加载移动设备的数据,这就是为什么我不能在服务器端进行此操作)。
我试图在函数中复制(完整复制,无引用)数组,因为我认为包含数据的初始变量,因为她不在函数中,在 UI 线程上,并将其访问到函数调用 UI 线程。=> 不起作用。(所以我错了)。
setTimout( {computations}, 0)
如您所见,我尝试在 a 中启动计算,这是我在其他 Stack Overflow 类似问题上看到很多时间的解决方案 =>也不起作用。
我在基本的 JavaScript 环境中运行,我使用的唯一库是 jQuery。
那么,这里是否有一种方法可以强制此计算在其他线程(或类似的线程)中工作,或者更全局,不要阻塞 UI 线程?
android - 如何处理几种方法,做繁重的计算?
在我的应用程序中,我导入 gpx 和 kml 文件以在地图上显示轨迹和航点。对于这个操作,我使用了大约 5 种方法。一切正常,除非我尝试使用 exfilechoser 导入几个长的 gpx/kml 轨道。屏幕变黑几秒钟,logcat 说:跳过帧(> 600)。我怎样才能得到这些 UI 计算?或者我怎么能用大约 5 种方法来使用 AsyncTask?这可能吗?
python - 存储和使用经过训练的神经网络
我正在尝试开发一个神经网络来预测时间序列。
据我了解,我正在使用训练集训练我的神经网络,并使用测试集对其进行验证。
当我对结果感到满意时,我可以使用我的神经网络来预测新值,而神经网络本身基本上就是我使用训练集调整的所有权重。
这个对吗?
如果是这样,我应该只训练我的网络一次,然后只使用我的网络(权重)来预测未来的值。您通常如何避免重新计算整个网络?我是否应该将所有权重保存在数据库或其他东西中,这样我就可以随时访问它而无需再次训练它?
如果我的理解是正确的,我可以受益于在专用计算机(例如超级计算机)上进行繁重的计算,然后在网络服务器、iPhone 应用程序或类似的东西上使用我的网络,但我不知道如何存储它。
java - 繁重处理期间的 LibGDX 加载屏幕
长话短说: 我正在尝试在 LibGDX 中制作加载屏幕,不仅需要加载纹理和音频等资产,还需要创建世界对象(超过 1000 万个对象)-我可能想研究减少数量未来的物体,但我的问题仍然适用于它是一个物体还是数万亿个物体。
在对象初始化期间,GDXrender()
方法停止,由于我推测的滞后。它会延迟整个应用程序进入“无响应”几秒钟。
我已经研究了几个月,但没有找到太多东西。我发现的 90% 的话题或我问的人,总是说同样的话;使用 AssetManager。我试过这个,但它似乎只支持资产,而不是繁重的处理世界对象。有人告诉我它可以支持自定义类,但是由于缺乏文档,我从来没有让它工作。
与我最相似的最佳主题是这个主题,它让我想到在 Gdx.app.postRunnable() 中使用 Gdx.app.postRunnable()。结果是这样的:
该解决方案效果很好。它做了繁重的处理,设置加载屏幕的百分比,然后绘制它。因此,为了显示,这个解决方案解决了我从未绘制百分比的问题。但是,这种解决方案仍然使应用程序在繁重的进程之间变成“无响应”;这会冻结最终的音乐播放。
通过在 postRunnables 中添加足够的 postRunnables,不会有延迟,因为繁重的进程不再存在 - 相反,它建立在繁重的进程拆分为迷你进程的基础上,从而解决了“无响应”状态。虽然这么多postRunnables对于“干净的代码”来说不是很实用,因为它需要30多个postRunnables,而上面的代码只有2个。代码很容易变丑,所以我寻求替代方案。
这篇文章也很有趣,解释了我面临的完全相同的问题,但是结果没有成功。
我在 Java Swing 中通过两个线程实现了这一点;一个主线程和一个 loadingScreen 线程 (LCThread)。进入 loadingScreen 时,LCThread 开始绘制 loadingScreen,而主线程进行繁重的处理。完成后,主线程使用它之前处理的对象。可悲的是,我无法将其转换为 LibGDX,因为两个线程无法单独绘制。
短篇小说:我需要编写一个加载屏幕,它在绘制进度(在render()
方法中处理)时加载繁重的后台处理(初始化大量对象)并在显示加载屏幕时播放音乐,所有这些都不会滞后于应用程序进入“没反应”。
你有什么建议吗?
asynchronous - RxJS 使繁重的工作部分异步,简单
我想让 RxJS Observable 来处理我的繁重工作。但我希望它在需要时使订阅异步。例如:
在这种情况下,after 字符串会在从 observable 输出整个数据之后打印出来。但我希望 observable 处理繁重的工作,并在需要时使剩余的工作异步。
所以我想到的一种方法是将重要的部分放在 setTimeout 中。我已经在网上搜索过,但还没有找到解决方案。有哪些可能的方法,哪一种更好?
multithreading - F# / MailBoxProcessor 在接近 100% 的负载下对 PostAndReply 没有响应
我有一个MailBoxProcessor
,它执行以下操作:
主循环(
type AsyncRunner
:https ://github.com/kkkmail/ClmFSharp/blob/master/Clm/ContGen/AsyncRun.fs#L257 - 行号可能会随着我不断更新代码而改变)。它生成一些“模型”,将它们中的每一个编译到特定于模型的文件夹中,将它们作为外部进程生成,然后每个模型使用 WCFAsyncRunner
通过调用updateProgress
. 一个模型可能需要几天时间才能运行。一旦完成任何模型,跑步者就会生成/产生更多。它被设计为以 100% 的处理器负载运行(但优先ProcessPriorityClass.BelowNormal
级Environment.ProcessorCount
:MailBoxProcessor
目前,我通过使用“异步”编辑了几乎所有内容… |> Async.Start
以确保我“永远不会”阻塞主循环。我可以通过调用
member this.getState () = messageLoop.PostAndReply GetState
.或者我可以向它发送一些命令(再次使用 WCF),例如
member this.start()
,member this.stop()
, ...</p>
这就是有趣的地方。一切正常!PostAndReply
但是,如果我运行一个“监视器”,它会通过在无限循环中有效地调用(暴露为)来请求一个状态this.getState ()
,过一会儿它就会挂断。我的意思是它最终会返回,但会有一些无法预测的大延迟(比如几分钟)。同时,我可以发出命令,它们确实快速返回,但getState
仍然没有返回。
是否有可能使其在接近 100% 的负载下响应?非常感谢!
sql - 在 Rails 中的仪表板视图上处理繁重 SQL 查询的最佳方法
我有这个仪表板(报告),它基本上执行繁重的 sql 查询并将其结果显示在表格网格上,非常标准的东西。
但是,有时,由于数据量大和 sql 复杂性,查询非常繁重,浏览器会一直挂起,直到用户出错。
我没有 n+1 查询,并尝试添加分页,但我仍然面临这个问题。
对此最好的方法是什么?使用后台作业?
有没有办法在后台执行此查询,以防止请求失败?
我尝试实现一个 sidekiq 工作人员,但我不确定在工作完成后是否可以从工作人员那里获得结果。
query
包含对字符串的 SQL 查询。
有什么见解吗?
python - 使用 Numba 并行化矩阵计算
我正在尝试在 Python 3.6 中并行化以下函数:
其中 :
predictors[,]
是一个输入数组,具有n
-rows 和p
-features,并且d[]
是一个-sizen
数组。
函数product_cols()
定义为:
其中 :ci[]
是 -大小cj[]
的p
数组并且di, dj
是实数。
有人可以帮我简单地并行化吗?
node.js - 如何在nodejs上完成child_process?
所以,我有一个在 Kubernetes 上运行的节点中提供的服务,我需要每 30 分钟执行一次非常繁重的操作(CRON JOB)。这是我的应用程序上每个租户的一堆数据库操作(目前,5 个租户)。
问题是,如果我在同一个进程上启动所有,即使是异步的,服务会承受过多的负载并崩溃。
因此,我尝试使用 child_process 模块。我的想法是为每个租户创建一个新进程,做它需要做的事情,然后终止该进程。
我正在使用 child_process.fork('heavyLoadFile') 创建子进程。
问题是当工作完成时,CP 并没有被摧毁。他们作为一个“僵尸”过程呆在那里,完全什么都不做。
我试图在 CP 上进行 process.kill() ,但它也杀死了父进程。
我怎样才能只杀死 child_process?哦,你们有没有想出更好的方法来处理这些重物?
android - Android重度渲染的最佳实践是什么
问题
- 在 Android 视图中重度渲染的最佳实践是什么?
- 建议的方法是否指向正确的方向?
- 有哪些替代方案?
描述
我的 Android 应用滚动浏览heavy rendered content
. 一个屏幕的渲染最多可能需要 500 毫秒。最终图像应显示给用户。
Heavy rendering
每秒可以触发多次(最多 20 次),只需通过手指拖动即可。
一般来说,只有最后一个电话很重要。可以丢弃中间未处理的呼叫。但是,如果中间调用已处理,则在呈现下一个/最后一个调用时向用户显示结果是有意义的。
显然,如果你heavy rendering
放入主线程,UI 将被冻结,用户体验将受到影响。
当前实施
主意
重度渲染以及“最后一次通话很重要”要求让您考虑使用单独的线程和RxJava Flowable
.
这个想法是有两个位图:
intermediate bitmap
- 在一个线程中使用它,让heavy rendering
绘制图片所需的时间尽可能多final bitmap
- 如果应用正在调用 onDraw 函数,则使用它来存储最终图片并显示给用户
脚步:
- 触发处理后,调用被缓冲,只处理最后一个可用的
- 渲染执行到
intermediate bitmap
(这是一个漫长的过程) - 渲染完成后,
intermediate bitmap
转入final bitmap
(这个应该很快) final bitmap
每当应用程序想要刷新屏幕时都会在屏幕上绘制(这也应该很快)。步骤 3 和 4 应该synchronized
防止闪烁。
架构
示意图如下所示:
代码
从技术上讲,它可以这样做(也是示意图,省略了一些细节):
问题
一般来说,它有效,但并不完美:
- 如果渲染和输出intermediate->final都放在主线程中,则屏幕在渲染时冻结,
- 如果只将输出intermediate->final放到主线程,屏幕闪烁,
- 如果渲染和输出intermediate->final都放在计算线程中,则在渲染过程中只显示屏幕的一部分。
更新:
这条评论对我帮助很大: https ://stackoverflow.com/a/57610119/10475643
看来,这条线引起了整个小冲突:
因为PorterDuff.Mode.CLEAR
不能很好地配合硬件加速。这会导致闪烁和部分屏幕输出。最后,我将两个drawBitmap
s 都放到了线程中。只要我删除drawColor
或关闭硬件加速,闪烁就消失了。