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='' 可以避免在某些操作系统上出现额外的空行。
相关推荐
迷路爸爸1803 分钟前
Rustdesk 安装客户端以及自己搭建服务器跑通参考资料
运维·服务器
hyf_code22 分钟前
Midjourney Describe API 的对接和使用
java·服务器·midjourney
PanYu——BJ23 分钟前
Linux 安装NFS共享文件夹
linux·运维·服务器
IT修炼家34 分钟前
Ubuntu server安装中文支持
linux·服务器·ubuntu
汪款学嵌入式2 小时前
VMware虚拟机 Ubuntu没有共享文件夹的问题
linux·运维·ubuntu
黑客Ash2 小时前
DVWA亲测sql注入漏洞
服务器·网络·数据库·sql·web安全·oracle·php
安科瑞刘鸿鹏2 小时前
新能源汽车安全充电管理方案
大数据·运维·服务器·物联网·能源
网际探险者2 小时前
企业数据文档加密软件产品选择_安全文档加密方案
服务器·网络·安全·web安全·网络安全
记录测试点滴2 小时前
【自动化】requirements.txt
运维·自动化