12.4【java exp4][debug]

  1. 减少I/O操作:每次写入一行数据会导致频繁的磁盘I/O操作,这会显著降低性能。可以通过批量写入多行数据来减少I/O次数。

  2. 使用更高效的数据结构:在生成随机浮点数时,可以考虑使用NumPy库来生成数组,而不是使用列表推导式,因为NumPy在处理大规模数值计算时效率更高。

  3. 多线程或多进程:利用多线程或多进程来并行生成数据,可以充分利用CPU资源,加快数据生成速度

pro1

Exception in thread Thread-3:

Traceback (most recent call last):

File "C:\Users\26861\AppData\Local\Programs\Python\Python39\lib\threading.py", line 980, in _bootstrap_inner

self.run()

File "d:\.Project\python\venv\lib\site-packages\ipykernel\ipkernel.py", line 766, in run_closure

_threading_Thread_run(self)

File "C:\Users\26861\AppData\Local\Programs\Python\Python39\lib\threading.py", line 917, in run

self._target(*self._args, **self._kwargs)

File "C:\Users\26861\AppData\Local\Programs\Python\Python39\lib\multiprocessing\pool.py", line 513, in _handle_workers

cls._maintain_pool(ctx, Process, processes, pool, inqueue,

File "C:\Users\26861\AppData\Local\Programs\Python\Python39\lib\multiprocessing\pool.py", line 337, in _maintain_pool

Pool._repopulate_pool_static(ctx, Process, processes, pool,

File "C:\Users\26861\AppData\Local\Programs\Python\Python39\lib\multiprocessing\pool.py", line 326, in _repopulate_pool_static

w.start()

File "C:\Users\26861\AppData\Local\Programs\Python\Python39\lib\multiprocessing\process.py", line 121, in start

self._popen = self._Popen(self)

File "C:\Users\26861\AppData\Local\Programs\Python\Python39\lib\multiprocessing\context.py", line 327, in _Popen

return Popen(process_obj)

File "C:\Users\26861\AppData\Local\Programs\Python\Python39\lib\multiprocessing\popen_spawn_win32.py", line 73, in init

hp, ht, pid, tid = _winapi.CreateProcess(

OSError: [WinError 1455] 页面文件太小,无法完成操作。

表明在尝试启动多进程时,系统页面文件(也称为交换文件或虚拟内存)的大小不足以支持当前的操作。

解决方法:

  1. 增加页面文件大小

    • 打开"控制面板" -> "系统和安全" -> "系统" -> "高级系统设置"。
    • 在"性能"部分点击"设置"按钮。
    • 转到"高级"选项卡,点击"更改"按钮。
    • 取消选中"自动管理所有驱动器的分页文件大小"。
    • 选择系统所在的驱动器(通常是C盘),然后选择"自定义大小",输入初始大小和最大值。建议将最大值设置为物理内存的1.5到2倍。
    • 点击"设置"按钮,然后重启计算机以应用更改。
  2. 减少并发进程数

    • 如果增加页面文件大小不可行,可以尝试减少多进程的数量。例如,如果你使用 multiprocessing.Pool,可以减少 Pool 的大小:

并发逻辑主要使用了 multiprocessing 模块中的 Pool 类来实现多进程并行处理

这里使用了 cpu_count() 函数获取系统中的 CPU 核心数,并创建了一个与 CPU 核心数相同数量的进程池。

使用 pool.map 方法将 generate_random_floats 函数并行应用于多个任务。每个任务生成 num_values_per_line 个随机浮点数。batch_size 是当前批次需要生成的浮点数总数,batch_size // num_values_per_line 计算了需要生成的批次数量。

. 增加批量处理的大小

通过增加每次批量处理的大小,可以减少 I/O 操作的次数,从而提高整体性能。

2. 使用更高效的文件写入方式

当前代码使用 csv.writer 逐行写入数据,这可能会导致频繁的 I/O 操作。可以考虑一次性写入更大的数据块。

3. 并发写入文件

虽然多进程生成数据已经提高了效率,但在写入文件时仍然是单线程操作。可以考虑使用多线程或异步 I/O 来并发写入文件。

4. 优化内存使用

确保生成的数据不会占用过多内存,特别是在生成大文件时。

[[value] for value in data_chunk] 改为 [value for value in data_chunk],减少嵌套列表的创建。

  • 内存占用 :增大批量处理大小意味着每次生成和处理的数据量更大,这会显著增加内存消耗。如果批量处理的大小过大,可能会导致内存不足,进而引发 MemoryError 或其他内存相关的错误。

  • 解决方案:可以通过监控内存使用情况,逐步增加批量处理的大小,找到一个平衡点,既能提高效率又不会超出系统内存限制。

  • 文件写入压力:虽然减少了 I/O 操作的次数,但每次写入的数据量更大,可能会对磁盘 I/O 造成更大的压力,尤其是在磁盘速度较慢的情况下。

  • 解决方案:可以考虑使用更快的存储介质(如 SSD)或优化文件系统的配置,以减轻 I/O 压力。

pro2

错误提示表明 writer.writerows 方法期望接收一个可迭代对象(例如列表的列表),但实际接收到的是一个浮点数。这通常是因为 data_chunk 中的数据结构不符合预期。

pro3

错误 ValueError: Pool not running 表明在调用 pool.map 时,进程池已经关闭或没有正确启动。从你的代码来看,pool.close()pool.join() 被放在了 while 循环内部,这意味着每次循环迭代都会关闭并等待进程池完成,导致后续的 pool.map 调用失败。

你需要将 pool.close()pool.join() 移动到 while 循环之外,确保进程池在整个数据生成过程中保持运行状态。

  • open(output_file, mode='w', newline=''): 这行代码打开一个文件,文件路径由 output_file 变量指定。mode='w' 表示以写入模式打开文件。如果文件不存在,则会创建一个新文件;如果文件存在,则会清空文件内容。
  • newline='': 这个参数用于控制换行符的行为。在写入 CSV 文件时,设置 newline='' 可以避免在某些操作系统上出现额外的空行。
相关推荐
IT成长日记20 小时前
【Nginx开荒攻略】Nginx主配置文件结构与核心模块详解:从0到1掌握nginx.conf:
linux·运维·nginx·配置文件
代码的余温20 小时前
Web服务器VS应用服务器:核心差异解析
运维·服务器·前端
NiKo_W21 小时前
Linux 开发工具(1)
linux·运维·服务器
艾莉丝努力练剑1 天前
【C++】类和对象(下):初始化列表、类型转换、Static、友元、内部类、匿名对象/有名对象、优化
linux·运维·c++·经验分享
风_峰1 天前
PuTTY软件访问ZYNQ板卡的Linux系统
linux·服务器·嵌入式硬件·fpga开发
会开花的二叉树1 天前
UDP Socket 进阶:从 Echo 到字典服务器,学会 “解耦” 网络与业务
服务器·网络·udp
-SGlow-1 天前
Linux相关概念和易错知识点(45)(网络层、网段划分)
linux·运维·服务器·网络
潘潘潘潘潘潘潘潘潘潘潘潘1 天前
【MySQL】从零开始学习MySQL:基础与安装指南
linux·运维·服务器·数据库·学习·mysql
ZzzZZzzzZZZzzzz…1 天前
Nginx_Tomcat综合案例
运维·nginx·tomcat·负载均衡·rhce·反向代理·https加密服务
努力努力再努力wz1 天前
【c++进阶系列】:map和set的模拟实现(附模拟实现的源码)
java·linux·运维·开发语言·c++