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='' 可以避免在某些操作系统上出现额外的空行。
相关推荐
VirusVIP1 小时前
Windows CMD通过adb检查触摸屏Linux驱动是否被编译
linux·运维·adb
chennalC#c.h.JA Ptho1 小时前
ubuntu studio 系统详解
linux·运维·服务器·经验分享·ubuntu·系统安全
yt948325 小时前
Docker-基础(数据卷、自定义镜像、Compose)
运维·docker·容器
水银嘻嘻7 小时前
web 自动化之 KDT 关键字驱动详解
运维·自动化
Vone_668 小时前
node.js 邮箱验证服务器搭建
运维·服务器·node.js
丢丢丢丢丢丢~8 小时前
apache2的默认html修改
linux·运维·服务器
wusam8 小时前
Linux系统管理与编程20:Apache
linux·运维·服务器·apache·shell编程
ChironW9 小时前
Ubuntu 24.04 LTS系统上配置国内时间同步
linux·运维·服务器·ubuntu
TPBoreas9 小时前
排查服务器内存空间预警思路
运维·服务器
yayaer29 小时前
GOOSE 协议中MAC配置
服务器·网络·goose