-
减少I/O操作:每次写入一行数据会导致频繁的磁盘I/O操作,这会显著降低性能。可以通过批量写入多行数据来减少I/O次数。
-
使用更高效的数据结构:在生成随机浮点数时,可以考虑使用NumPy库来生成数组,而不是使用列表推导式,因为NumPy在处理大规模数值计算时效率更高。
-
多线程或多进程:利用多线程或多进程来并行生成数据,可以充分利用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] 页面文件太小,无法完成操作。
表明在尝试启动多进程时,系统页面文件(也称为交换文件或虚拟内存)的大小不足以支持当前的操作。
解决方法:
-
增加页面文件大小:
- 打开“控制面板” -> “系统和安全” -> “系统” -> “高级系统设置”。
- 在“性能”部分点击“设置”按钮。
- 转到“高级”选项卡,点击“更改”按钮。
- 取消选中“自动管理所有驱动器的分页文件大小”。
- 选择系统所在的驱动器(通常是C盘),然后选择“自定义大小”,输入初始大小和最大值。建议将最大值设置为物理内存的1.5到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=''
可以避免在某些操作系统上出现额外的空行。