我必须从一个csv文件(692mb)中读取10万行,该文件由26000行和4列组成,在多个线程中,每个线程从一个随机行开始,当我到达100万行时停止
我的尝试:
from multiprocessing.pool import ThreadPool as Pool
import linecache
import random
import csv
from random import randint
from time import sleep
csvfile=csv.reader(open('sample.csv'))
def process_line(l):
sleep(randint(0,3))
print (l)
def get_random_line():
lines_to_get=random.randint(0,2600000)
line = linecache.getline('sample.csv', lines_to_get)
for lines_to_get, line in enumerate(csvfile):
print (line)
if lines_to_get >= 1000000:
break
yield (line)
f = get_random_line()
t = Pool(processes=3)
for i in f:
t.map(process_line, (i,))
t.close()
但结果是,这些行不是从随机开始的,而是每次都从第一行开始。在
结果
^{pr2}$严格的要求是每次我都要从一条随机的线开始
据我所知:
这是获取随机线并存储它。在
在for循环中紧接着,您将用csvfile的第一行替换这个“line”变量。在
^{pr2}$这会导致你失去先前设定的随机线。在
这将在不需要多处理的情况下满足您的要求,部分原因是您很可能不需要它。在
一个简单的基准使方案3在速度上成为赢家。在
选项1:
可能这会导致处理大量数据的速度很慢,但我不认为在使用csv模块时,你希望从一个随机的点开始就可以绕过这个问题。在
您可以绕过从字节0读取文件的事实,方法是使用
f.seek(start_byte)
对字节的起始点进行种子设定,然后用f.read(my_chunk_size)
读取文件中的一大块字节。在这种情况下,为了得到一个新的行,您必须在随机的起始点之后通过new_line_char自己找到行,为这些行执行自己的解析器,并在读取的行数上保留一个计数器。在选项2: 如果你的文件小于1GB,这就是你所说的。 在计算机上安装numpy,一次读取文件。 通过索引到完整的行集合来选择1e6行。 下面将有
^{pr2}$dtype=np.float64
,如果您想保留整数,也有一些方法可以做到这一点。为此,我建议研究一下纽比的文献。在选项3: 我对linecache有点好奇,所以我也为它做了一个解决方案。 更新了正确的发电机设置。在
简单基准测试(Py36):
csv,3.5米线,1米,2米,3米,读数0.5米线。为了使numpy有点公平,其他人有一行代码将所有读取的行转换为一个float列表。在
结果:
在运行随机数生成器之前,您是否尝试过播种?用这样的代码:
在生成任何随机数之前添加它
相关问题 更多 >
编程相关推荐